ข้อผิดพลาด PHP แปลก: 'ไม่สามารถใช้ฟังก์ชันส่งคืนค่าในบริบทการเขียน'


178

ฉันได้รับข้อผิดพลาดนี้และฉันไม่สามารถทำหัวหรือก้อยได้

ข้อความแสดงข้อผิดพลาดที่แน่นอนคือ:

ข้อผิดพลาดร้ายแรง: ไม่สามารถใช้ฟังก์ชันส่งคืนค่าในบริบทการเขียนใน /home/curricle/public_html/descarga/index.php บรรทัดที่ 48

บรรทัดที่ 48 คือ:

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

เกิดอะไรขึ้นที่นี่?

นี่คือฟังก์ชั่นเต็มรูปแบบ:

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') ควรเป็น $ _POST ['sms_code'] ตามลำดับ
davidtbernal

นอกจากนี้ยังไม่จำเป็นต้องใช้ประโยคอื่นในคำสั่ง if $stateจะไม่ถูกแก้ไขไม่จำเป็นต้องรีเซ็ตเป็นNOTHING_SUBMITEDหากเป็นค่านั้นแล้ว
เกล็นเดย์ตัน

ผู้คนแห่งอนาคตใครสามารถอธิบายความหมายของข้อความได้จริงหรือ
OGHaza

คำตอบ:


111

คุณหมายถึง

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

แม้ว่าบังเอิญคุณหมายถึงจริงๆ

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

3
... หรือif (isset($_POST['sms_code']) === TRUE ) {:-)
keyboardSmasher

ฉันยังพบวิธีแก้ปัญหาสำหรับปัญหาที่ฉันเผชิญอยู่ดังนั้น FYI - สิ่งนี้มีไว้สำหรับ $ _REQUEST (พารามิเตอร์ใน URL ของหน้า)
TheCuBeMan

5
ฉันรู้ว่าฉันมาสายเกินไป แต่ก็ขึ้นอยู่กับเวอร์ชันของ PHP ด้วยใช่ไหม ฉันค่อนข้างแน่ใจว่าถูกต้องตามกฎหมายในเวอร์ชัน PHP รุ่นต่อมาเช่น 5.6 แต่ฉันคิดว่ามันไม่ได้อยู่ใน 5.3
UnsettlingTrend

490

สิ่งนี้จะเกิดขึ้นเมื่อใช้ค่าว่างในฟังก์ชันส่งคืน:

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

เพราะว่างเปล่าไม่ใช่ฟังก์ชั่น แต่โครงสร้างภาษา (ไม่แน่ใจ) และใช้เพียงตัวแปร:

ขวา:

empty($someVar)

ไม่ถูกต้อง:

empty(someFunc())

ตั้งแต่ PHP 5.5 มันรองรับมากกว่าตัวแปร แต่ถ้าคุณต้องการมันก่อนที่ 5.5 trim($name) == falseการใช้งาน จากเอกสารที่ว่างเปล่า


แดงฉันเพิ่งได้รับข้อผิดพลาดนี้เช่นกันทำตัวอย่างที่แน่นอนของคุณ ขอบคุณ x3 เป็นข้อผิดพลาดแปลกอะไรฉันยังไม่เข้าใจ: / ว่างเปล่า () สามารถรับสาย .. และตัด () คืนค่าสตริง .. ดังนั้นด้วย?
Nick Rolando

15
@Shredder - เป็นเพราะempty()ไม่ใช่ฟังก์ชั่น echoมันเป็นภาษาสร้างเช่น ตัวแยกวิเคราะห์ PHP จัดการการสร้างภาษาต่างกัน ในกรณีของemptyมันจะดูที่พารามิเตอร์เป็นตัวแปรไม่ใช่สิ่งที่ต้องถูกประเมินดังนั้นถ้าคุณพยายามที่จะผ่านฟังก์ชั่นมันจะแตก อย่างน้อยนั่นก็เป็นความเข้าใจของฉัน ข้อมูลเพิ่มเติมที่นี่และที่นี่
อนุญาต

1
นี่เป็นข้อผิดพลาดที่แน่นอนที่ฉันพบเช่นกัน ทำไมนี่ไม่ใช่คำตอบยอดนิยม!
อดัม F

2
เพื่อนร่วมงานของฉันได้รับข้อผิดพลาดนี้ในขณะที่ฉันไม่ได้ เกิดความสับสนจนกระทั่งฉันตรวจสอบเอกสาร - ตั้งแต่ PHP 5.5 จะว่างเปล่า () จะยอมรับการส่งคืนจากฟังก์ชันและตัวแปร us3.php.net/empty
James Alday

1
สยองขวัญสำหรับ 5.5! จนกว่าคุณจะอัปเกรดคุณสามารถโยนสิ่งนี้ลงในฟังก์ชั่นหลักของคุณรวมถึงไฟล์:function mTEE($val){ return empty($val); }
TecBrat

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

เปลี่ยนบรรทัดนี้เป็น

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

คุณกำลังใช้ parentheseis () สำหรับ$_POSTแต่คุณต้องการวงเล็บเหลี่ยม []

:)

หรือ

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

1
ไม่คุณไม่สามารถเขียน "if (isset ($ _ POST ['sms_code'] == TRUE) {" มีข้อมูลที่ขาดหายไป ")"
middus

1
+ คะแนนเจ๋ง ๆ หลายพันล้านรายการสำหรับ Phrae 'คุณกำลังใช้วงเล็บ ... แต่คุณต้องการวงเล็บเหลี่ยม' ซึ่งเป็นปัญหาของฉัน (นั่นทำให้ฉันต้องถามคำถามนี้)
Kevin Horn

1
ว้าวขอบคุณมาก! ตอนนี้ถ้า parser จะพูดว่า "ฉันคาดว่าจะได้วงเล็บเหลี่ยมหลังจากชื่อตัวแปรของอาร์เรย์, duh!" มันจะฟังดูเย็นกว่า "ไม่สามารถใช้ค่าส่งคืนฟังก์ชันในบริบทการเขียน" ฉันอาจส่งให้คน PHP เป็นข้อเสนอแนะ
Joe Völker


11

แก้ไขไวยากรณ์ (คุณมีวงเล็บหายไปในตอนท้าย):

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

ป.ล. คุณไม่ต้องการ == TRUE ส่วนหนึ่งเพราะบูลีน (จริง / เท็จ) ถูกส่งคืนแล้ว


4

เหตุการณ์นี้อาจเกิดขึ้นได้มากกว่าหนึ่งสถานการณ์ด้านล่างนี้เป็นรายการสถานการณ์ที่เป็นที่รู้จัก

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

// ใช้วงเล็บเพื่อเข้าถึงองค์ประกอบของอาเรย์จะใช้วงเล็บในการเรียกใช้ฟังก์ชัน

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

สิ่งนี้สามารถถูกเรียกใช้เมื่อเราพยายามเพิ่มผลลัพธ์ของฟังก์ชันดังนี้:

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

คุณต้องการที่จะได้รับข้อบกพร่อง? เพราะนี่คือวิธีที่คุณได้รับข้อบกพร่อง ไม่จริงจัง แต่อย่าทำเช่นนี้ มันก็เหมือนกับการทำif(i++)มันอาจดูสั้นกว่าการเพิ่มตัวนับและประเมินค่าของมัน แต่มันจะทำให้คุณปวดหัวถ้ามันเป็นโรคจิต แก้ไข: ฉันไม่ได้หมายความว่าคุณทำเพียงชี้ไปที่โปรแกรมเมอร์ใหม่ที่อ่านคำตอบและคิดว่านี่เป็นสิ่งที่เรียบร้อยเพื่อเพิ่มค่าในขณะที่คำนวณหรือประเมินสิ่งที่กำลังเพิ่มขึ้น
Victor D.

@VictorD ฉันแค่บอกว่าข้อผิดพลาดอาจเกิดขึ้นในสถานการณ์ที่หมายความว่าไม่ดีที่จะทำ
เมห์ Karamosly

ฉันขอแนะนำอีกหนึ่งข้อได้ไหม คุณทำ=แทน==คำสั่ง if
โยสิยาห์

สำหรับฉันมันเป็นรุ่น PHP, อัพเกรด 7.0 :)
nodws


3

ฉันก็มีปัญหาที่คล้ายกันเช่นคุณ ปัญหาคือคุณใช้ php เวอร์ชั่นเก่า ฉันได้อัพเกรดเป็น PHP 5.6 และปัญหานี้ไม่มีอยู่อีกต่อไป


1

สถานการณ์อื่นที่ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากข้อผิดพลาดทางไวยากรณ์:

ucwords($variable) = $string;

1
เป็นเพราะucwordsคืนสตริงและบริบทของการโทรไม่ถูกต้องถ้าคุณลองด้วย$Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;แล้วแสดงค่าใหม่ที่กำหนด
กี

0

ฉันยังพบปัญหานี้เนื่องจากข้อผิดพลาดทางไวยากรณ์ ใช้ "(" แทน "[" ในดัชนีอาร์เรย์:

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

0

ข้อผิดพลาดนี้ค่อนข้างถูกต้องและเน้นประเด็นไวยากรณ์บริบท สามารถทำซ้ำได้โดยทำไวยากรณ์ "ไม่สามารถกำหนดได้" ชนิดใดก็ได้ ตัวอย่างเช่น

ฟังก์ชั่นไวยากรณ์ ($ hello) {.... จากนั้นพยายามเรียกฟังก์ชั่นราวกับว่าทรัพย์สินและกำหนดค่า .... $ this-> ไวยากรณ์ ('Hello') = 'World';

ข้อผิดพลาดดังกล่าวจะถูกโยนเพราะ syntactially คำสั่งที่ไม่ถูกต้อง ไม่สามารถเขียนการกำหนดที่ถูกต้องของ 'โลก' ในบริบทที่คุณใช้ (เช่น syntactically ไม่ถูกต้องสำหรับบริบทนี้) 'ไม่สามารถใช้ฟังก์ชั่นส่งคืนค่าได้' หรืออ่านได้ 'ไม่สามารถกำหนดค่าทางขวาให้กับฟังก์ชั่นได้เนื่องจากฟังก์ชั่นอ่านอย่างเดียว'

ข้อผิดพลาดเฉพาะในรหัส OPs จะถูกเน้นเป็นโดยใช้วงเล็บแทนวงเล็บเหลี่ยม


-1

อาจมีสาเหตุจากตัวดำเนินการผิด = เมื่อควร ==

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

รหัสนี้จะพ่นข้อผิดพลาดนี้

โปรดทราบว่า = เป็นตัวดำเนินการที่ได้รับมอบหมายไม่ใช่ตัวดำเนินการเปรียบเทียบ แก้ไขคือการเปลี่ยน = เป็น ==

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.