Lỗi PHP lạ: 'Không thể sử dụng giá trị trả về của hàm trong ngữ cảnh ghi'


178

Tôi đang gặp phải lỗi này và tôi không thể tạo ra đầu hoặc đuôi của nó.

Thông báo lỗi chính xác là:

Lỗi nghiêm trọng: Không thể sử dụng giá trị trả về của hàm trong ngữ cảnh ghi trong /home/curricle/public_html/descarga/index.php trên dòng 48

Dòng 48 là:

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

Điều gì có thể xảy ra ở đây?

Đây là chức năng đầy đủ:

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') phải là $ _POST ['sms_code'].
davidtbernal

Ngoài ra, mệnh đề khác trên câu lệnh if là không cần thiết. $statesẽ không được sửa đổi, không cần thiết lập lại NOTHING_SUBMITEDnếu nó đã có giá trị đó.
Glenn Dayton

Mọi người trong tương lai, có ai có thể giải thích thông điệp thực sự có nghĩa là gì không?
OGHaza

Câu trả lời:


111

Ý bạn là

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

mặc dù tình cờ bạn thực sự có ý nghĩa

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

3
... hoặc if (isset($_POST['sms_code']) === TRUE ) {:-)
bàn

Tôi cũng tìm thấy giải pháp cho vấn đề mà tôi đang gặp phải, vì vậy FYI - điều này cũng có giá $ _REQUEST (tham số trong URL của trang).
TheCuBeMan

5
Tôi nhận ra tôi đã quá muộn với điều này, nhưng nó cũng phụ thuộc vào phiên bản PHP, phải không? Tôi khá chắc chắn rằng điều đó hợp pháp trong các phiên bản PHP sau này như 5.6, nhưng tôi nghĩ rằng nó không có trong 5.3
UnsettlingTrend

490

Điều này cũng xảy ra khi sử dụng rỗng khi trả về hàm:

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

bởi vì trống không phải là một hàm mà là một cấu trúc ngôn ngữ (không chắc chắn) và nó chỉ nhận các biến:

Đúng:

empty($someVar)

Sai lầm:

empty(someFunc())

Kể từ PHP 5.5, nó hỗ trợ nhiều hơn các biến. Nhưng nếu bạn cần nó trước 5.5, hãy sử dụng trim($name) == false. Từ tài liệu trống .


Dang, tôi cũng đã nhận được lỗi này, làm ví dụ chính xác của bạn (cắt bên trong trống rỗng). Cảm ơn x3. Thật là một lỗi lạ .. Tôi vẫn không hiểu đầy đủ: / blank () có thể lấy một chuỗi .. và trim () trả về một chuỗi .. vậy wth?
Nick Rolando

15
@Shredder - Đó empty()thực sự là một chức năng; đó là một cấu trúc ngôn ngữ echo. Trình phân tích cú pháp PHP xử lý các cấu trúc ngôn ngữ khác nhau. Trong trường hợp empty, nó xem tham số là một biến, không phải là thứ để đánh giá, vì vậy nếu bạn cố gắng truyền một hàm, nó sẽ bị hỏng. Ít nhất đó là sự hiểu biết của tôi về nó. Thêm thông tin ở đâyở đây .
cấp

1
Đây là lỗi chính xác mà tôi gặp phải. Tại sao đây không phải là câu trả lời hàng đầu!?
Adam F

2
Đồng nghiệp của tôi đã nhận được lỗi này trong khi tôi thì không. Sự nhầm lẫn xảy ra sau đó, cho đến khi tôi kiểm tra các tài liệu - kể từ PHP 5.5, thì rỗng () sẽ chấp nhận trả về từ một hàm cũng như một biến. us3.php.net/empty
James Alday 26/214

1
Horray cho 5.5! Cho đến khi bạn nâng cấp, bạn có thể ném một cái gì đó như thế này vào chức năng chính của mình bao gồm tệp:function mTEE($val){ return empty($val); }
TecBrat

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

thay đổi dòng này thành

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

Bạn đang sử dụng Parentheseis () cho $_POSTnhưng bạn muốn dấu ngoặc vuông []

:)

HOẶC LÀ

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

1
Không, bạn không thể viết "if (isset ($ _ POST ['sms_code'] == TRUE) {", thiếu ")".
middus

1
+ vài tỷ điểm tuyệt vời cho phrae 'bạn đang sử dụng dấu ngoặc đơn ... nhưng bạn muốn dấu ngoặc vuông', đó là vấn đề của tôi (dẫn tôi đến câu hỏi này) là
Kevin Horn

1
Phù, thx người đàn ông! Bây giờ, nếu trình phân tích cú pháp sẽ nói "Tôi mong đợi dấu ngoặc vuông sau tên của biến mảng, duh!", Thì nó sẽ nghe hay hơn "Không thể sử dụng giá trị trả về của hàm trong ngữ cảnh ghi". Tôi có thể gửi nó cho những người PHP như một gợi ý.
Joe Völker

13

cho WORDPRESS :

thay vì:

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

nên là:

if (!get_option('smth'))

11

Cú pháp đúng (cuối cùng bạn đã có dấu ngoặc đơn bị thiếu):

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

ps bạn không cần == TRUE một phần, vì BOOLESE (đúng / sai) đã được trả lại.


4

Điều này có thể xảy ra trong nhiều kịch bản, dưới đây là danh sách các kịch bản nổi tiếng:

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

// sử dụng dấu ngoặc đơn để truy cập một phần tử của mảng, dấu ngoặc đơn được sử dụng để gọi hàm

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

Điều này cũng có thể được kích hoạt khi chúng tôi cố gắng tăng kết quả của một chức năng như dưới đây:

$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ạn có muốn nhận được lỗi? Bởi vì đây là cách bạn gặp lỗi. Không nhưng nghiêm túc, đừng bao giờ làm điều này. Giống như làm if(i++), nó có thể trông ngắn hơn so với việc tăng bộ đếm và sau đó đánh giá giá trị của nó, nhưng nó sẽ khiến bạn đau đầu nếu nó bị lỗi. Chỉnh sửa: Tôi không ngụ ý rằng bạn làm điều đó, chỉ đưa ra cho các lập trình viên mới đọc câu trả lời và nghĩ rằng đây là một điều gọn gàng, để tăng giá trị trong khi tính toán hoặc đánh giá cái đang được tăng lên.
Victor D.

@VictorD. Tôi chỉ nói rằng lỗi có thể xảy ra trong tình huống đó có nghĩa là không tốt để làm điều đó.
Mehdi Karamosly

Tôi có thể đề nghị thêm một cái nữa không? Bạn làm =thay vì ==trong một câu lệnh if.
Giô

Đối với tôi đó là phiên bản PHP, nâng cấp lên 7.0 :)
gật đầu

3

Vấn đề là ở chỗ ()bạn phải đi[]

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

bởi

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

3

Tôi cũng có một vấn đề tương tự như của bạn. Vấn đề là bạn đang sử dụng một phiên bản php cũ. Tôi đã nâng cấp lên PHP 5.6 và vấn đề không còn tồn tại.


1

Một kịch bản khác trong đó lỗi này được xử lý do lỗi cú pháp do:

ucwords($variable) = $string;

1
Là bởi vì ucwordstrả về một chuỗi và ngữ cảnh của cuộc gọi là không chính xác, nếu bạn thử ví dụ với $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, sau đó hiển thị cho bạn giá trị mới được gán.
kip

0

tôi cũng gặp vấn đề này do lỗi cú pháp. Sử dụng "(" thay vì "[" trong chỉ mục mảng:

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

0

Lỗi này là hoàn toàn đúng và làm nổi bật một vấn đề cú pháp theo ngữ cảnh. Có thể được sao chép bằng cách thực hiện bất kỳ loại cú pháp "không thể gán" nào. Ví dụ:

function Syntax ($ hello) {.... sau đó cố gắng gọi hàm như một thuộc tính và gán giá trị .... $ this-> Cú pháp ('Hello') = 'World';

Các lỗi trên sẽ được ném bởi vì cú pháp tuyên bố là sai. Việc gán đúng 'Thế giới' không thể được viết trong ngữ cảnh bạn đã sử dụng (nghĩa là không đúng về mặt cú pháp cho bối cảnh này). 'Không thể sử dụng giá trị trả về của hàm' hoặc nó có thể đọc 'Không thể gán giá trị bên phải cho hàm vì chỉ đọc'

Lỗi cụ thể trong mã OP được tô sáng, sử dụng dấu ngoặc thay vì dấu ngoặc vuông.


-1

Có thể do toán tử sai, =, khi cần ==

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

Mã này ném lỗi này

Lưu ý rằng = là toán tử gán và không phải toán tử so sánh. Khắc phục là thay đổi = thành ==.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.