Tuhaf PHP hatası: 'Yazma bağlamında işlev dönüş değeri kullanılamıyor'


178

Bu hatayı alıyorum ve başını veya kuyruğunu yapamıyorum.

Kesin hata mesajı:

Önemli hata: 48. satırdaki /home/curricle/public_html/descarga/index.php dosyasında yazma bağlamında işlev dönüş değeri kullanılamıyor

Satır 48:

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

Burada neler olabilir?

İşte tam fonksiyon:

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);
}

22
$ _POST ('sms_code') bu arada $ _POST ['sms_code'] olmalıdır.
davidtbernal

Ayrıca, if deyimindeki else cümlesi gerekli değildir. $statedeğiştirilmeyecektir, NOTHING_SUBMITEDzaten bu değerse sıfırlamanıza gerek yoktur .
Glenn Dayton

Geleceğin insanları, mesajın gerçekte ne anlama geldiğini açıklayabilir mi?
OGHaza

Yanıtlar:


111

Diyorsun ki

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

bu arada gerçekten demek istiyorsun

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

3
... or if (isset($_POST['sms_code']) === TRUE ) {:-)
keyboardSmasher

Ayrıca, karşılaştığım sorunun çözümünü buldum, bu yüzden FYI - bu da $ _REQUEST (sayfanın URL'sindeki parametreler) için de geçerli.
TheCuBeMan

5
Bunun çok geç olduğumu fark ettim, ama aynı zamanda PHP sürümüne bağlı, değil mi? Bunun 5.6 gibi sonraki PHP sürümlerinde yasal olduğuna eminim, ancak 5.3'te olmadığını düşünüyorum
UnsettlingTrend

490

Bu, işlev dönüşünde boş kullanıldığında da olur:

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

çünkü boş bir işlev değil, bir dil yapısıdır (emin değilim) ve yalnızca değişkenleri alır:

Sağ:

empty($someVar)

Yanlış:

empty(someFunc())

PHP 5.5'ten beri, değişkenlerden daha fazlasını destekler. Ancak 5.5'ten önce ihtiyacınız varsa kullanın trim($name) == false. Gönderen boş belgelere .


Dang, bu hatayı da aldım, tam örneğini yapıyorum (içi boş kırp). Teşekkürler x3. Ne garip bir hata .. Hala tam olarak anlamıyorum: / empty () bir dize alabilir .. ve trim () bir dize döndürür .. yani wth?
Nick Rolando

15
@Shredder - Çünkü empty()aslında bir işlev değil; bu bir dil kurgusu gibi echo. PHP ayrıştırıcısı dil yapılarını farklı şekilde işler. Durumda empty, parametreye bir değişken olarak bakar, değerlendirilecek bir şey değil, bu nedenle bir işlevi geçmeye çalışırsanız kırılır. En azından benim anlayışım bu. Burada ve burada daha fazla bilgi .
hibe

1
Bu benim de karşılaştığım hata. Neden bu en iyi cevap değil !?
Adam F

2
Meslektaşım ben bu hatayla karşılaşıyordu. Karmaşıklık, ben dokümanlar kontrol kadar - PHP 5.5 itibariyle, empty () bir işlev yanı sıra bir değişken dönüş kabul eder. us3.php.net/empty
James Alday

1
5.5 için Horray! Yükseltene kadar, ana işlevin içine böyle bir şey atabilirsin:function mTEE($val){ return empty($val); }
TecBrat

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

bu satırı olarak değiştir

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

İçin parantez () kullanıyorsunuz $_POSTancak köşeli parantez [] istiyorsunuz

:)

VEYA

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 

1
Hayır, "if (isset ($ _ POST ['sms_code'] == TRUE) {", eksik ")" yazamazsınız.
middus

1
+ 'parantez kullanıyorsunuz ... ama köşeli parantez istediniz' ifadesi için birkaç milyar serin nokta, bu da benim sorunumdu (beni bu soruya yönlendirdi)
Kevin Horn

1
Vay be, teşekkürler adamım! Şimdi, ayrıştırıcı "Bir dizi değişkeninin adından sonra köşeli parantez bekliyorum, duh!" Derseniz, "Yazma bağlamında işlev dönüş değeri kullanılamıyor" ifadesinden çok daha havalı görünecektir. Ben bir öneri olarak PHP çocuklar için gönderebilir.
Joe Völker

13

için WordPress :

onun yerine:

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

olmalı:

if (!get_option('smth'))

11

Doğru sözdizimi (sonunda paranteziniz eksik):

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

ps == TRUE parçası gerekmez , çünkü BOOLEAN (doğru / yanlış) zaten iade.


4

Bu, birden fazla senaryoda olabilir, aşağıda iyi bilinen senaryoların bir listesi bulunmaktadır:

// 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

// bir dizinin elemanına erişmek için parantez kullanarak, bir işlevi çağırmak için parantez kullanılır

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

Bu, aşağıdaki gibi bir işlevin sonucunu artırmaya çalıştığımızda da tetiklenebilir:

$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.

Böcek almak ister misin? Çünkü böcek bu şekilde elde edilir. Hayır ama cidden, bunu asla yapma. Onun yaptığı gibi if(i++), sayacı arttırmaktan ve daha sonra değerini değerlendirmekten daha kısa görünebilir, ancak hata yaparsa baş ağrısına neden olacaktır. Düzenleme: Im bunu yapmadan ima değil, sadece yeni programcılar cevap okuma ve bu düzgün bir şey olduğunu düşünüyorum, hesaplanırken veya artırılmakta olan değerlendirirken değerleri artırmak için.
Victor D.

@VictorD. Sadece bu durumda hatanın olabileceğini söylüyorum, bu bunu yapmak iyi değil demektir.
Mehdi Karamosly

Bir tane daha önerebilir miyim? Bir if ifadesi =yerine bunu yaparsınız ==.
Josiah

Benim için PHP sürümü, 7.0 sürümüne yükseltme :)
nodws

3

Sorun şu ()ki, gitmek zorundasın[]

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

tarafından

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

3

Seninki gibi bir sorunum da vardı. Sorun eski bir php sürümü kullanıyor olmasıdır. PHP 5.6'ya yükselttim ve sorun artık mevcut değil.


1

Bu hatanın sözdizimi hatası nedeniyle tetiklendiği başka bir senaryo:

ucwords($variable) = $string;

1
Çünkü ucwordsbir dize döndürme ve arama bağlamı yanlış, örneğin ile denerseniz $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, o zaman size atanan yeni değeri gösterir.
kip

0

Ayrıca sözdizimi hatası nedeniyle bu sorunla karşılaştı. Dizi dizininde "[" yerine "(" kullanılması:

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

0

Bu hata oldukça doğrudur ve bağlamsal bir sözdizimi sorununu vurgular. Her türlü "atanamaz" sözdizimi gerçekleştirilerek çoğaltılabilir. Örneğin:

function Sözdizimi ($ hello) {.... sonra işlevi bir özellik gibi çağırmayı ve bir değer atamayı deneyin .... $ this-> Sözdizimi ('Merhaba') = 'Dünya';

Yukarıdaki hata sözdizimsel olarak yanlış olduğu için atılacaktır. 'Dünya'nın doğru ataması, kullandığınız bağlamda yazılamaz (yani, bu bağlam için sözdizimsel olarak yanlış). 'İşlev dönüş değeri kullanılamıyor' veya 'salt okunur olduğu için işleve sağ değer atanamıyor'

OPs kodundaki belirli hata, köşeli parantez yerine parantez kullanılarak vurgulanır.


-1

Yanlış operatör neden olabilir = =, ne zaman olması gerektiği ==

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

Bu kod bu hatayı atar

= İfadesinin karşılaştırma operatörü değil atama operatörü olduğunu unutmayın. Düzeltme = = = olarak değiştirmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.