ไม่สามารถใช้วิธีการส่งคืนค่าในบริบทการเขียน


465

ฉันคิดว่าโค้ดต่อไปนี้ควรใช้งานได้ แต่ไม่แก้ไข (ตอนนี้ทำงานใน PHP 5.5+) :

if (!empty($r->getError()))

อยู่ที่ไหนgetError():

public function getError()
{
    return $this->error;
}

แต่ฉันจบลงด้วยข้อผิดพลาดนี้:

ไม่สามารถใช้วิธีการส่งคืนค่าในบริบทการเขียน

สิ่งนี้หมายความว่า? นี่ไม่ใช่แค่อ่านใช่ไหม


2
อาจเป็น PHP 5.5 คุณจะได้รับอนุญาตให้ส่งผ่านนิพจน์ไปยังempty: wiki.php.net/rfc/empty_isset_exprs
Carlos Campderrós


ตกลงฉันพบว่าคำตอบของ porneL ถูกต้องเช่นกันรหัสของฉัน if ( !$e->find('div') ) ที่ตรวจสอบว่าองค์ประกอบ HTML DOM ปัจจุบันว่างเปล่าหรือไม่ ฉันใช้มันในลูปเพื่อพิมพ์ Div เดียวโดยไม่ต้อง Div ด้านใน
เซเลม

คำตอบ:


769

empty() จำเป็นต้องเข้าถึงค่าโดยอ้างอิง (เพื่อตรวจสอบว่าจุดอ้างอิงนั้นมีบางอย่างอยู่) และ PHP ก่อน 5.5 ไม่สนับสนุนการอ้างอิงถึงค่าชั่วคราวที่ส่งคืนจากฟังก์ชัน

อย่างไรก็ตามปัญหาที่แท้จริงที่คุณมีคือการที่คุณใช้empty()เลยเชื่อว่าผิดค่า "ว่างเปล่า" จะแตกต่างจาก "เท็จ"

!isset($thing) || !$thingที่ว่างเปล่าเป็นเพียงนามแฝงสำหรับ เมื่อสิ่งที่คุณกำลังตรวจสอบอยู่เสมอ (ใน PHP ผลของการเรียกฟังก์ชั่นอยู่เสมอ) ที่empty()ฟังก์ชั่นคืออะไร แต่ผู้ประกอบการปฏิเสธ

PHP ไม่มีแนวคิดของความว่างเปล่า ค่าที่ประเมินว่าเป็นเท็จจะว่างเปล่าค่าที่ประเมินเป็นจริงจะไม่ว่างเปล่า มันเป็นสิ่งเดียวกัน รหัสนี้:

$x = something();
if (empty($x)) 

และนี่:

$x = something();
if (!$x) 

มีผลลัพธ์เดียวกันเสมอในทุกกรณีสำหรับประเภทข้อมูลทั้งหมด (เนื่องจาก$xมีการกำหนดไว้empty()ซ้ำซ้อน)

มีค่าส่งคืนจากเมธอดอยู่เสมอ (แม้ว่าคุณจะไม่มีreturnคำสั่งจะมีค่าส่งคืนและมีอยู่null) ดังนั้น:

if (!empty($r->getError()))

มีเหตุผลเทียบเท่ากับ:

if ($r->getError())

29
นี่เป็นคำตอบที่ดีกว่าคำตอบที่เลือกไว้ในปัจจุบัน
SystemParadox

20
@gcb: ไม่คู่มือ PHP บอกอย่างชัดเจนว่ามันเหมือนกัน: "empty () ตรงข้าม(boolean) varยกเว้นว่าไม่มีการสร้างคำเตือนเมื่อไม่ได้ตั้งค่าตัวแปร"
Kornel

16
ส่วนที่ไม่ได้สร้างคำเตือนนั้นสำคัญมาก ... ว่างเปล่า ($ var) จะคืนค่าจริงถ้าเป็น 0, '', array (), NULL หรือไม่ได้กำหนดไว้ เป็นวิธีปฏิบัติที่ดีโดยเฉพาะอย่างยิ่งเพื่อให้คุณสามารถบันทึกคำเตือนจริงของคุณได้โดยไม่ต้องเติมไฟล์ให้หมด
landons

3
ตกลงคำตอบที่ดี แต่มีวิธีใดที่จะหลีกเลี่ยงสิ่งนี้ได้ไม่มีใครรู้บ้าง
Javatar

3
@EugenMihailescu ทั่วไปที่ ok แต่มันไม่ได้เป็นอย่างเคร่งครัดเทียบเท่าที่ว่างเปล่า () เพราะ"", 0ฯลฯ "ว่างเปล่า" แต่ไม่เป็นโมฆะ
Kornel

330

หมายเหตุ:นี่เป็นคำตอบที่ได้รับการโหวตอย่างสูงและมีทัศนวิสัยสูง แต่โปรดทราบว่ามันส่งเสริมการเข้ารหัสที่ไม่ดีและไม่จำเป็น! ดูคำตอบของ @ Kornelสำหรับวิธีการที่ถูกต้อง

หมายเหตุ # 2:ฉันรับรองข้อเสนอแนะในการใช้@ คำตอบของคอร์เนล เมื่อฉันเขียนคำตอบนี้เมื่อสามปีที่แล้วฉันแค่ตั้งใจจะอธิบายลักษณะของข้อผิดพลาดไม่จำเป็นต้องรับรองทางเลือก ไม่แนะนำข้อมูลโค้ดด้านล่าง


มันเป็นข้อ จำกัด ของที่ว่างเปล่า ()ในรุ่น PHP ด้านล่าง 5.5

หมายเหตุ: empty () ตรวจสอบตัวแปรเพียงอย่างเดียวเนื่องจากสิ่งอื่นใดจะส่งผลให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ ในคำอื่น ๆ ต่อไปนี้จะไม่ทำงาน: ว่างเปล่า (ตัด ($ ชื่อ))

คุณต้องเปลี่ยนสิ่งนี้

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
นี่คือการต่อต้านอย่างบ้าคลั่ง
David Murdoch

47
หมายเหตุ: isset()เดียวกันเป็นจริงด้วย ie: isset($this->foo->getBar())จะทำให้เกิดปัญหาเดียวกัน
catchdave

7
คำตอบของ porneL จะอธิบายในรายละเอียดเพิ่มเติมพร้อมทางออกที่ดีกว่า
SystemParadox

5
@SystemParadox - ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ดีกว่า" คำตอบของ porneL นั้นละเอียดยิ่งขึ้นด้วยวิธีการ "ทำความสะอาด" แต่ก็ไม่ได้อธิบายที่มาของข้อผิดพลาดเช่นกัน
Peter Bailey

4
เพราะมันไม่ผิดหรอก @deceze มันไม่ใช่คำตอบที่ดีที่สุดคุณจะไม่ได้รับข้อโต้แย้งใด ๆ จากฉันที่นั่น ฉันยังโหวตให้ porneL ด้วยตัวเอง มันเป็นที่เก่าแก่มากคำตอบ แต่ก็ไม่ผิด เกี่ยวกับคะแนนโหวตสูง: จำไว้ว่า porneL มาถึงเกือบ 17 เดือนหลังจากนี้
Peter Bailey

37

ตามเอกสาร PHP :

ที่ว่างเปล่า () ตรวจสอบตัวแปรเพียงอย่างเดียวเนื่องจากสิ่งอื่นจะทำให้เกิดข้อผิดพลาดในการวิเคราะห์

คุณไม่สามารถใช้empty()โดยตรงกับค่าส่งคืนของฟังก์ชัน ให้ตั้งค่าการส่งคืนจากgetError()ตัวแปรและรันempty()บนตัวแปรแทน


19

ฉันมักจะสร้างฟังก์ชั่นระดับโลกที่เรียกว่า is_empty () เพียงเพื่อแก้ไขปัญหานี้

function is_empty($var)
{ 
 return empty($var);
}

จากนั้นทุกที่ฉันจะใช้ว่างเปล่าตามปกติ () ฉันเพิ่งใช้ is_empty ()


2
เป็นการดีกว่าที่จะไม่ทำสิ่งนี้และทำตามมาตรฐาน (น่ารำคาญเท่าที่ควร)
tonyhb

1
@dynamism คุณสามารถอธิบายได้ว่าทำไมไม่
Janis Veinbergs

1
เพราะฟังก์ชั่นอำนวยความสะดวกอาจเป็นปัญหาในการอ่านรหัสของคนอื่น นอกจากนี้ในสถาปัตยกรรม MVC / HMVC จะทำให้โครงสร้างของคุณยุ่งเหยิง ในตอนท้ายของวันผู้เขียนโค้ด PHP ควรรู้ว่ามันมีข้อ จำกัด และสามารถเข้าใจวิธีแก้ไขปัญหาเล็ก ๆ โดยไม่มีฟังก์ชั่นอำนวยความสะดวก
tonyhb

14
ว้าวคุณได้คิดค้นเพียงฟังก์ชั่นการปฏิเสธ คุณรู้หรือไม่ว่า PHP มี!โอเปอเรเตอร์สำหรับสิ่งนี้ :)
Kornel

4

ตามที่คนอื่น ๆ ชี้ให้เห็นมันเป็นข้อ จำกัด (แปลก) ที่ว่างเปล่า ()

สำหรับ purproses ส่วนใหญ่การทำเช่นนี้เท่ากับการโทรที่ว่างเปล่า แต่ใช้งานได้:

if ($r->getError() != '')

5
สิ่งนี้ไม่เป็นความจริง - empty()ครอบคลุมความเป็นไปได้มากมายมากกว่าเพียงแค่สตริงว่างเปล่า
Robbie Averill

3
นั่นเป็นเหตุผลที่มันบอกว่า "เพื่อจุดประสงค์ส่วนใหญ่ " ไม่ใช่ทั้งหมด
Jani Hartikainen

2

ปัญหาคือสิ่งนี้คุณต้องการทราบว่าข้อผิดพลาดไม่ว่างเปล่า

public function getError() {
    return $this->error;
}

การเพิ่มเมธอด isErrorSet () จะช่วยแก้ปัญหาได้

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

ตอนนี้จะทำงานได้ดีกับรหัสนี้โดยไม่ต้องแจ้งให้ทราบล่วงหน้า

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

วิธีอื่นในการตรวจสอบว่าอาร์เรย์ว่างเปล่าหรือไม่:

count($array)>0

มันใช้งานได้สำหรับฉันโดยไม่มีข้อผิดพลาด

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