Câu trả lời:
Môi trường mới của bạn có thể có E_STRICT
các cảnh báo được bật trongerror_reporting
các phiên bản PHP <= 5.3.x hoặc đơn giản là đã error_reporting
đặt thành ít nhất là E_WARNING
với các phiên bản PHP> = 5.4. Lỗi mà được kích hoạt khi $res
đang NULL
hoặc chưa được khởi tạo:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP sẽ báo cáo một thông báo lỗi khác nếu $res
đã được khởi tạo cho một số giá trị nhưng không phải là một đối tượng:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Để tuân thủ các E_STRICT
tiêu chuẩn trước PHP 5.4 hoặc mức E_WARNING
lỗi thông thường trong PHP> = 5.4, giả sử bạn đang cố gắng tạo một đối tượng chung và gán thuộc tính success
, bạn cần khai báo $res
là một đối tượng stdClass
trong không gian tên toàn cục:
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();
. Mặt khác, mã này không phải là sự thay thế tương đương cho việc tạo đối tượng ngầm "PHP cũ".
Thông báo này đã được E_STRICT
dành cho PHP <= 5.3. Kể từ PHP 5.4, nó đã được thay đổi thành E_WARNING
. Vì E_WARNING
tin nhắn rất hữu ích, bạn không muốn vô hiệu hóa chúng hoàn toàn.
Để thoát khỏi cảnh báo này, bạn phải sử dụng mã này:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Đây là sự thay thế hoàn toàn tương đương . Nó đảm bảo chính xác điều tương tự mà PHP đang âm thầm làm - không may mắn với cảnh báo bây giờ - tạo đối tượng ngầm. Bạn phải luôn luôn kiểm tra xem đối tượng đã tồn tại chưa, trừ khi bạn hoàn toàn chắc chắn rằng nó không tồn tại. Mã do Michael cung cấp nói chung là không tốt, bởi vì trong một số bối cảnh, đối tượng đôi khi có thể đã được xác định tại cùng một vị trí trong mã, tùy thuộc vào hoàn cảnh.
Undefined variable: res
.
Đơn giản,
$res = (object)array("success"=>false); // $res->success = bool(false);
Hoặc bạn có thể khởi tạo các lớp với:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
và điền các giá trị với:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Thêm thông tin: https://www.php.net/manual/en/lingu.types.object.php#lingu.types.object.casting
$this->route->uri = new stdClass();
không làm việc cho tôi, tôi vẫn có cảnh báo. Lưu ý: $this->route
hiện có.
Nếu bạn đặt ký tự "@" bắt đầu dòng thì PHP sẽ không hiển thị bất kỳ cảnh báo / thông báo nào cho dòng này. Ví dụ:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Để ngăn cảnh báo này cho dòng này, bạn phải đặt ký tự "@" bắt đầu dòng như thế này:
@$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
Tôi đang sử dụng thủ thuật này khi phát triển. Tôi không thích vô hiệu hóa tất cả các thông báo cảnh báo nếu bạn không xử lý chính xác các cảnh báo thì chúng sẽ trở thành một lỗi lớn trong tương lai.
Hãy thử điều này nếu bạn có mảng và thêm các đối tượng vào nó.
$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.
}
Điều này sẽ gửi ARRAY của các đối tượng để sử dụng sau ~!
Thử cái này:
ini_set('error_reporting', E_STRICT);
E_STRICT
lỗi ngoại trừ lỗi, bao gồm cả việc chặn các thông báo cho các lỗi nghiêm trọng. Đó không phải là một gợi ý hợp lý để giải quyết cảnh báo cụ thể này, và hơn thế nữa là điều bạn gần như không bao giờ muốn làm. Tại sao 5 người nêu lên điều này, tôi không có manh mối.
ini_set('error_reporting', -1);
trong khi gỡ lỗi, nhưng không sử dụng ở trên, như mọi khi.
Tôi đã có vấn đề tương tự và điều này dường như để giải quyết vấn đề. Bạn chỉ cần khởi tạo đối tượng $ res thành một lớp. Giả sử ở đây tên lớp là kiểm tra.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Đây là một cảnh báo mà tôi gặp phải trong PHP 7, cách khắc phục dễ dàng này là bằng cách khởi tạo biến trước khi sử dụng nó
$myObj=new \stdClass();
Một khi bạn đã xác định được nó rồi thì bạn có thể sử dụng nó cho các đối tượng
$myObj->mesg ="Welcome back - ".$c_user;
Vấn đề này được gây ra bởi vì bạn đang gán cho một thể hiện của đối tượng không được bắt đầu. Ví dụ:
Trường hợp của bạn:
$user->email = 'exy@gmail.com';
Giải pháp:
$user = new User;
$user->email = 'exy@gmail.com';
Một cách đơn giản để nhận lỗi này là gõ (a) bên dưới, nghĩa là gõ (b)
(a) $this->my->variable
(b) $this->my_variable
Tầm thường, nhưng rất dễ bị bỏ qua và khó phát hiện nếu bạn không tìm kiếm nó.
_
và->
Bạn có thể cần kiểm tra xem biến được khai báo và có đúng loại không.
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;
Xem các lớp ẩn danh PHP .
Tôi đã gặp một vấn đề tương tự trong khi cố gắng thêm một biến vào một đối tượng được trả về từ API. Tôi đã lặp lại thông qua dữ liệu với một vòng lặp foreach.
foreach ( $results as $data ) {
$data->direction = 0;
}
Điều này đã ném "Tạo đối tượng mặc định từ giá trị trống" Ngoại lệ trong Laravel.
Tôi đã sửa nó với một thay đổi rất nhỏ.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Bằng cách đơn giản làm cho dữ liệu $ trở thành một tài liệu tham khảo.
Tôi hy vọng điều đó sẽ giúp ai đó, điều đó thật khó chịu với tôi!
Trước tiên, bạn nên tạo đối tượng $ res = new \ stdClass ();
sau đó gán đối tượng với khóa và giá trị thay $ res-> thành công = false;
thay
.) Trường hợp bạn muốn ngắt dòng sau một số nội dung, hãy thêm hai khoảng trắng vào nội dung hiển thị của dòng trước khi ngắt.
không bạn không .. nó sẽ tạo ra nó khi bạn thêm giá trị thành công vào đối tượng. Lớp mặc định được kế thừa nếu bạn không chỉ định một.
Hãy thử sử dụng:
$user = (object) null;
$res
đâu?