Kesalahan PHP aneh: 'Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis'

178

Saya mendapatkan kesalahan ini dan saya tidak bisa mengatasinya.

Pesan kesalahan sebenarnya adalah:

Kesalahan fatal: Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis di /home/curricle/public_html/descarga/index.php on line 48

Jalur 48 adalah:

if (isset($_POST('sms_code') == TRUE ) {

Apa yang mungkin terjadi di sini?

Inilah fungsi lengkapnya:

function validate_sms_code() {

    $state = NOTHING_SUBMITED;

    if (isset($_POST('sms_code') == TRUE ) {
        $sms_code = clean_up($_POST('sms_code'));
        $return_code = get_sepomo_code($sms_code);

        switch($return_code) {

          case 1:
            //no error
            $state = CORRECT_CODE;
            break;

          case 2:
            // code already used
            $state = CODE_ALREADY_USED;
            break;

          case 3:
            // wrong code
            $state = WRONG_CODE;
            break;

          case 4:
            // generic error
            $state = UNKNOWN_SEPOMO_CODE;
            break;

          default:
            // unknown error
            $state = UNKNOWN_SEPOMO_CODE;
            throw new Exception('Unknown sepomo code: ' . $return_code);
            break;
        }

    } else {
        $state = NOTHING_SUBMITED;
    }
    dispatch_on_state($state);
}
cfischer
sumber
22
$ _POST ('sms_code') seharusnya $ _POST ['sms_code'], omong-omong.
davidtbernal
Juga, klausa lain pada pernyataan if tidak diperlukan. $statetidak akan dimodifikasi, tidak perlu mengatur ulang ke NOTHING_SUBMITEDjika sudah nilai itu.
Glenn Dayton
Orang-orang di masa depan, adakah yang bisa menjelaskan apa arti pesan itu sebenarnya?
OGHaza

Jawaban:

111

Maksudmu

if (isset($_POST['sms_code']) == TRUE ) {

meskipun kebetulan Anda benar-benar jahat

if (isset($_POST['sms_code'])) {
kekacauan
sumber
3
... atau if (isset($_POST['sms_code']) === TRUE ) {:-)
keyboardSmasher
Saya juga menemukan solusi untuk masalah yang saya hadapi, jadi FYI - ini berlaku juga untuk $ _REQUEST (parameter di URL halaman).
TheCuBeMan
5
Saya menyadari bahwa saya sangat terlambat dalam hal ini, tetapi juga tergantung pada versi PHP, bukan? Saya cukup yakin itu sah dalam versi PHP kemudian seperti 5.6, tapi saya pikir itu tidak dalam 5.3
UnsettlingTrend
490

Ini juga terjadi ketika menggunakan kosong pada pengembalian fungsi:

!empty(trim($someText)) and doSomething()

karena kosong bukan fungsi tetapi konstruksi bahasa (tidak yakin), dan hanya membutuhkan variabel:

Baik:

empty($someVar)

Salah:

empty(someFunc())

Sejak PHP 5.5, mendukung lebih dari variabel. Tetapi jika Anda membutuhkannya sebelum 5.5, gunakan trim($name) == false. Dari dokumentasi kosong .

rolfen
sumber
Dang, saya baru saja mendapatkan kesalahan ini juga, melakukan contoh tepat Anda (trim kosong di dalam). Terima kasih x3. Apa kesalahan aneh .. Saya masih tidak sepenuhnya mengerti: / blank () dapat mengambil string .. dan trim () mengembalikan sebuah string .. jadi wth?
Nick Rolando
15
@Shredder - Itu karena empty()sebenarnya bukan fungsi; itu adalah konstruksi bahasa, seperti echo. Pengurai PHP menangani konstruksi bahasa secara berbeda. Dalam kasus ini empty, ia melihat parameter sebagai variabel, bukan sesuatu yang harus dievaluasi, jadi jika Anda mencoba untuk melewati suatu fungsi, itu rusak. Setidaknya itulah pemahaman saya tentang hal itu. Info lebih lanjut di sini dan di sini .
berikan
1
Ini adalah kesalahan persis yang saya temui juga. Kenapa ini bukan jawaban teratas !?
Adam F
2
Rekan saya mendapatkan kesalahan ini sementara saya tidak. Terjadi kebingungan, sampai saya memeriksa dokumen - pada PHP 5.5, kosong () akan menerima pengembalian dari fungsi serta variabel. us3.php.net/empty
James Alday
1
Horray untuk 5.5! Sampai Anda memutakhirkan, Anda bisa melempar sesuatu seperti ini ke dalam fungsi utama Anda termasuk file:function mTEE($val){ return empty($val); }
TecBrat
22
if (isset($_POST('sms_code') == TRUE ) {

ubah baris ini menjadi

if (isset($_POST['sms_code']) == TRUE ) {

Anda menggunakan tanda kurung () untuk $_POSTtetapi Anda ingin tanda kurung siku []

:)

ATAU

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 
TigerTiger
sumber
1
Tidak, Anda tidak dapat menulis "if (isset ($ _ POST ['sms_code'] == BENAR) {", ada yang hilang ")".
middus
1
+ beberapa miliar poin keren untuk kalimat 'Anda menggunakan tanda kurung ... tetapi Anda ingin tanda kurung', yang merupakan masalah saya (yang mengarahkan saya ke pertanyaan ini) adalah
Kevin Horn
1
Fiuh, terima kasih! Sekarang, jika parser akan mengatakan "Saya mengharapkan tanda kurung setelah nama variabel array, ya!", Itu akan terdengar jauh lebih keren daripada "Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis." Saya mungkin mengirimkannya ke orang-orang PHP sebagai saran.
Joe Völker
13

untuk WORDPRESS :

dari pada:

if (empty(get_option('smth')))

seharusnya:

if (!get_option('smth'))
T.Todua
sumber
11

Sintaks yang benar (pada akhirnya Anda memiliki tanda kurung yang hilang):

if (isset($_POST['sms_code']) == TRUE ) {
                            ^

ps Anda tidak perlu == TRUE bagian, karena BOOLEAN (benar / salah) sudah dikembalikan.

middus
sumber
4

Ini dapat terjadi di lebih dari satu skenario, di bawah ini adalah daftar skenario terkenal:

// calling empty on a function 
empty(myFunction($myVariable)); // the return value of myFunction should be saved into a variable
// then you can use empty on your variable

// menggunakan tanda kurung untuk mengakses elemen array, tanda kurung digunakan untuk memanggil fungsi

if (isset($_POST('sms_code') == TRUE ) { ...
// that should be if(isset($_POST['sms_code']) == TRUE)

Ini juga dapat dipicu ketika kami mencoba meningkatkan hasil fungsi seperti di bawah ini:

$myCounter = '356';

$myCounter = intVal($myCounter)++; // we try to increment the result of the intVal...
// like the first case, the ++ needs to be called on a variable, a variable should hold the the return of the function then we can call ++ operator on it.
Mehdi Karamosly
sumber
Apakah Anda ingin mendapatkan bug? Karena beginilah cara Anda mendapatkan bug. Tidak tapi serius, jangan pernah melakukan ini. Ini seperti melakukan if(i++), mungkin terlihat lebih pendek daripada menambah penghitung dan kemudian mengevaluasi nilainya, tetapi itu akan menyebabkan Anda sakit kepala jika itu pernah keluar bug. Sunting: Saya tidak menyiratkan bahwa Anda melakukannya, hanya menunjukkan kepada pemrogram baru membaca jawaban dan berpikir ini adalah hal yang rapi, untuk menambah nilai sambil menghitung atau mengevaluasi apa yang sedang bertambah.
Victor D.
@ Viktor. Saya hanya mengatakan bahwa kesalahan dapat terjadi dalam situasi itu yang berarti tidak baik untuk melakukannya.
Mehdi Karamosly
Bisakah saya menyarankan satu lagi? Anda melakukannya =daripada ==dalam pernyataan if.
Josiah
Bagi saya itu adalah versi PHP, upgrade ke 7.0 :)
nodws
3

Masalahnya adalah ()Anda harus pergi[]

if (isset($_POST('sms_code') == TRUE)

oleh

if (isset($_POST['sms_code'] == TRUE)
Diego
sumber
3

Saya juga punya masalah serupa dengan Anda. Masalahnya adalah Anda menggunakan versi php lama. Saya telah meningkatkan ke PHP 5.6 dan masalahnya tidak ada lagi.

husnix
sumber
1

Skenario lain di mana kesalahan ini dipicu karena kesalahan sintaksis:

ucwords($variable) = $string;
Tomelin5
sumber
1
Apakah karena ucwordsmengembalikan string dan konteks panggilan salah, jika Anda mencoba misalnya dengan $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, maka menunjukkan kepada Anda nilai baru yang diberikan.
kip
0

saya juga mengalami masalah ini karena kesalahan sintaksis. Menggunakan "(" bukannya "[" dalam indeks array:

   foreach($arr_parameters as $arr_key=>$arr_value) {
        $arr_named_parameters(":$arr_key") = $arr_value;
    }
Shaakir
sumber
0

Kesalahan ini cukup benar dan menyoroti masalah sintaksis kontekstual. Dapat direproduksi dengan melakukan sintaksis "tidak dapat dialihkan" apa pun. Misalnya:

function Syntax ($ hello) {.... lalu coba panggil fungsi seolah-olah sebagai properti dan tetapkan nilai .... $ this-> Syntax ('Hello') = 'World';

Kesalahan di atas akan dilempar karena secara sintaksis pernyataan itu salah. Penugasan yang tepat untuk 'Dunia' tidak dapat ditulis dalam konteks yang Anda gunakan (mis. Secara sintaksis tidak benar untuk konteks ini). 'Tidak dapat menggunakan nilai pengembalian fungsi' atau bisa membaca 'Tidak dapat menetapkan nilai kanan ke fungsi karena hanya baca'

Kesalahan spesifik dalam kode OP seperti yang disorot, menggunakan tanda kurung bukan tanda kurung.

pengguna12845085
sumber
-1

Dapat disebabkan oleh operator yang salah, =, padahal seharusnya ==

if(mysql_num_rows($result) = 1)
    return $result;
else
    return false;

Kode ini melempar kesalahan ini

Perhatikan bahwa = adalah operator penugasan dan bukan operator pembanding. Perbaiki adalah mengubah = ke ==.

Hammad Khan
sumber