ฉันเห็นข้อผิดพลาดนี้หลังจากอัปเกรดสภาพแวดล้อม PHP เป็น PHP 5.4 ขึ้นไป ข้อผิดพลาดชี้ไปที่รหัสบรรทัดนี้:
ข้อผิดพลาด:
การสร้างวัตถุเริ่มต้นจากค่าว่าง
รหัส:
$res->success = false;
ฉันต้องประกาศ$res
วัตถุของฉันก่อน?
ฉันเห็นข้อผิดพลาดนี้หลังจากอัปเกรดสภาพแวดล้อม PHP เป็น PHP 5.4 ขึ้นไป ข้อผิดพลาดชี้ไปที่รหัสบรรทัดนี้:
ข้อผิดพลาด:
การสร้างวัตถุเริ่มต้นจากค่าว่าง
รหัส:
$res->success = false;
ฉันต้องประกาศ$res
วัตถุของฉันก่อน?
คำตอบ:
สภาพแวดล้อมใหม่ของคุณอาจมีE_STRICT
คำเตือนเปิดใช้งานในerror_reporting
เวอร์ชัน PHP <= 5.3.x หรือerror_reporting
ตั้งอย่างน้อยE_WARNING
ด้วยเวอร์ชัน PHP> = 5.4 ข้อผิดพลาดนั้นจะเริ่มทำงานเมื่อ$res
มีการNULL
เริ่มต้นหรือยัง:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP จะรายงานข้อความแสดงข้อผิดพลาดที่แตกต่างกันหาก$res
มีการเริ่มต้นค่าบางอย่างแล้ว แต่ไม่ใช่วัตถุ:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
เพื่อให้สอดคล้องกับE_STRICT
มาตรฐานก่อน PHP 5.4 หรือE_WARNING
ระดับข้อผิดพลาดปกติใน PHP> = 5.4 สมมติว่าคุณกำลังพยายามสร้างวัตถุทั่วไปและกำหนดคุณสมบัติsuccess
คุณต้องประกาศ$res
เป็นวัตถุstdClass
ในเนมสเปซส่วนกลาง:
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();
ตรวจสอบว่าวัตถุที่มีอยู่แล้ว: มิฉะนั้นรหัสนี้จะไม่ทดแทนเทียบเท่าสำหรับการสร้างวัตถุ "เก่า PHP" โดยนัย
ข้อความนี้มีE_STRICT
ไว้สำหรับ PHP <= 5.3 ตั้งแต่ PHP 5.4 E_WARNING
มันก็เปลี่ยนไป เนื่องจากE_WARNING
ข้อความมีประโยชน์คุณไม่ต้องการปิดการใช้งานอย่างสมบูรณ์
ในการกำจัดคำเตือนนี้คุณต้องใช้รหัสนี้:
if (!isset($res))
$res = new stdClass();
$res->success = false;
นี่คือการเปลี่ยนเทียบเท่าอย่างเต็มที่ มันทำให้มั่นใจในสิ่งเดียวกันกับที่ PHP กำลังทำอยู่อย่างเงียบ ๆ - โชคไม่ดีที่ได้รับคำเตือนตอนนี้ - การสร้างวัตถุโดยปริยาย คุณควรตรวจสอบว่าวัตถุนั้นมีอยู่แล้วหรือไม่เว้นแต่คุณจะแน่ใจอย่างแน่นอนว่ามันไม่มีอยู่จริง รหัสที่ไมเคิลให้มานั้นไม่ค่อยดีนักเพราะในบางบริบทวัตถุบางครั้งอาจถูกกำหนดไว้แล้วในที่เดียวกันในรหัสขึ้นอยู่กับสถานการณ์
Undefined variable: res
นี้จะทำให้คุณ
เพียงแค่
$res = (object)array("success"=>false); // $res->success = bool(false);
หรือคุณสามารถยกตัวอย่างคลาสด้วย:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
และเติมค่าด้วย:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
ข่าวสารเพิ่มเติม: https://www.php.net/manual/th/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();
ไม่ทำงานสำหรับฉันฉันยังคงมีคำเตือน หมายเหตุ: $this->route
มีอยู่แล้ว
หากคุณใส่ตัวอักษร "@" เริ่มต้นของบรรทัด PHP จะไม่แสดงคำเตือน / ประกาศใด ๆ สำหรับบรรทัดนี้ ตัวอย่างเช่น:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
ในการป้องกันการเตือนนี้สำหรับบรรทัดนี้คุณต้องใส่อักขระ "@" เริ่มจากบรรทัดดังนี้:
@$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20
ฉันใช้เคล็ดลับนี้เมื่อพัฒนา ฉันไม่ชอบปิดการใช้งานข้อความเตือนทั้งหมดเพราะถ้าคุณไม่จัดการคำเตือนอย่างถูกต้องแล้วพวกเขาจะกลายเป็นข้อผิดพลาดใหญ่ในอนาคต
ลองนี้ถ้าคุณมีอาร์เรย์และเพิ่มวัตถุ
$product_details = array();
foreach ($products_in_store as $key => $objects) {
$product_details[$key] = new stdClass(); //the magic
$product_details[$key]->product_id = $objects->id;
//see new object member created on the fly without warning.
}
ส่งARRAY of Objectsเพื่อใช้ในภายหลัง ~!
ลองสิ่งนี้:
ini_set('error_reporting', E_STRICT);
E_STRICT
ข้อผิดพลาดรวมถึงการระงับข้อความสำหรับข้อผิดพลาดร้ายแรง นั่นไม่ใช่ข้อเสนอแนะที่สมเหตุสมผลในการแก้ไขคำเตือนนี้โดยเฉพาะและสิ่งที่มากกว่านั้นคือสิ่งที่คุณไม่อยากทำ ทำไม 5 คนโหวตขึ้นสิ่งนี้ฉันไม่มีเงื่อนงำ
ini_set('error_reporting', -1);
ในขณะที่การดีบัก แต่ไม่ได้ใช้ข้างต้นเช่นเคย
ฉันมีปัญหาที่คล้ายกันและดูเหมือนจะแก้ปัญหาได้ คุณเพียงแค่ต้องเริ่มต้นวัตถุ $ res ให้ชั้นเรียน สมมติว่าที่นี่ชื่อชั้นคือการทดสอบ
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
นี่เป็นคำเตือนที่ฉันต้องเผชิญใน PHP 7 การแก้ไขอย่างง่ายคือการเริ่มต้นตัวแปรก่อนใช้งาน
$myObj=new \stdClass();
เมื่อคุณทำการลบล้างมันแล้วคุณสามารถใช้มันสำหรับวัตถุ
$myObj->mesg ="Welcome back - ".$c_user;
ปัญหานี้เกิดขึ้นเนื่องจากคุณกำหนดให้กับอินสแตนซ์ของวัตถุที่ไม่ได้เริ่มต้น สำหรับเช่น:
กรณีของคุณ:
$user->email = 'exy@gmail.com';
สารละลาย:
$user = new User;
$user->email = 'exy@gmail.com';
วิธีง่ายๆในการรับข้อผิดพลาดนี้คือการพิมพ์ (a) ด้านล่างหมายถึงการพิมพ์ (b)
(ก) $this->my->variable
(ข) $this->my_variable
เล็กน้อย แต่มองข้ามได้ง่ายและมองเห็นได้ยากหากคุณไม่ได้มองหามัน
_
และ->
คุณอาจต้องตรวจสอบว่าประกาศตัวแปรและมีประเภทที่ถูกต้อง
if (!isset($res) || !is_object($res)) {
$res = new \stdClass();
// With php7 you also can create an object in several ways.
// Object that implements some interface.
$res = new class implements MyInterface {};
// Object that extends some object.
$res = new class extends MyClass {};
}
$res->success = true;
ดูเรียน PHP ที่ไม่ระบุชื่อ
ฉันมีปัญหาที่คล้ายกันในขณะที่พยายามเพิ่มตัวแปรให้กับวัตถุที่ส่งคืนจาก API ฉันวนซ้ำข้อมูลด้วยลูป foreach
foreach ( $results as $data ) {
$data->direction = 0;
}
สิ่งนี้โยนข้อยกเว้น "การสร้างวัตถุเริ่มต้นจากค่าว่าง" ใน Laravel
ฉันแก้ไขด้วยการเปลี่ยนแปลงเล็กน้อยมาก
foreach ( $results as &$data ) {
$data->direction = 0;
}
เพียงแค่ทำการอ้างอิงข้อมูล $
ฉันหวังว่าจะช่วยให้ใครซักคนมันเป็นเรื่องน่ารำคาญสำหรับฉัน!
อันดับแรกคิดว่าคุณควรสร้างวัตถุ $ res = new \ stdClass ();
จากนั้นกำหนดออบเจกต์ด้วยคีย์และค่า thay $ res-> success = false;
thay
) ในกรณีที่คุณต้องการให้ตัวแบ่งบรรทัดหลังจากเนื้อหาบางส่วนให้ผนวกช่องว่างสองช่องเข้ากับเนื้อหาที่มองเห็นของบรรทัดก่อนถึงจุดพัก
ไม่คุณไม่ได้ .. มันจะสร้างมันขึ้นมาเมื่อคุณเพิ่มค่าความสำเร็จให้กับ object.the คลาสเริ่มต้นจะสืบทอดมาหากคุณไม่ได้ระบุไว้
ลองใช้:
$user = (object) null;
ฉันใส่ต่อไปนี้ที่ด้านบนของไฟล์ PHP faulting และข้อผิดพลาดก็ไม่แสดง:
error_reporting(E_ERROR | E_PARSE);
$res
อย่างไร