Ik zie deze fout alleen na het upgraden van mijn PHP-omgeving naar PHP 5.4 en hoger. De fout verwijst naar deze regel code:
Fout:
Standaardobject maken van lege waarde
Code:
$res->success = false;
Moet ik eerst mijn $res
object declareren?
Antwoord 1, autoriteit 100%
Uw nieuwe omgeving heeft mogelijk E_STRICT
-waarschuwingen ingeschakeld in error_reporting
voor PHP-versies <= 5.3.x, of gewoon error_reporting
hebben ingesteld op ten minste E_WARNING
met PHP-versies >= 5.4. Die fout wordt geactiveerd wanneer $res
NULL
is of nog niet is geïnitialiseerd:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP zal een ander foutbericht rapporteren als $res
al is geïnitialiseerd op een bepaalde waarde maar geen object is:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Om te voldoen aan de E_STRICT
-normen vóór PHP 5.4, of het normale E_WARNING
-foutniveau in PHP >= 5.4, ervan uitgaande dat u een generieke object en de eigenschap success
toewijzen, moet u $res
declareren als een object van stdClass
in de globale naamruimte:
$res = new \stdClass();
$res->success = false;
Antwoord 2, autoriteit 9%
Dit bericht is E_STRICT
voor PHP <= 5.3. Sinds PHP 5.4 is het helaas veranderd in E_WARNING
. Aangezien E_WARNING
-berichten nuttig zijn, wilt u ze niet volledig uitschakelen.
Om van deze waarschuwing af te komen, moet je deze code gebruiken:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Dit is volledig gelijkwaardige vervanging. Het verzekert precies hetzelfde wat PHP stilletjes aan het doen is – helaas met een waarschuwing nu – impliciete objectcreatie. U moet altijd controleren of het object al bestaat, tenzij u er absoluut zeker van bent dat dit niet het geval is. De code die door Michael wordt geleverd, is over het algemeen niet goed, omdat in sommige contexten het object soms al op dezelfde plaats in de code kan zijn gedefinieerd, afhankelijk van de omstandigheden.
Antwoord 3, autoriteit 2%
Gewoon,
$res = (object)array("success"=>false); // $res->success = bool(false);
Of je kunt lessen instantiëren met:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
en vul waarden in met:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Meer informatie:
https://www.php. net/manual/en/language.types.object.php#language.types.object.casting
Antwoord 4
Als je een “@” teken aan het begin van de regel zet, dan toont PHP geen waarschuwing/notificatie voor deze regel. Bijvoorbeeld:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Om deze waarschuwing voor deze regel te voorkomen, moet u het “@”-teken aan het begin van de regel als volgt plaatsen:
@$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
Ik gebruik deze truc bij het ontwikkelen. Ik vind het niet leuk om alle waarschuwingsberichten uit te schakelen, want als je waarschuwingen niet correct afhandelt, worden ze in de toekomst een grote fout.
Antwoord 5
Probeer dit als je een array hebt en voeg er objecten aan toe.
$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.
}
Hiermee wordt ARRAYvan Objectenverzonden voor later gebruik~!
Antwoord 6
-
Denk eerst dat je een object moet maken
$res = nieuw \stdClass(); -
ken vervolgens object toe met sleutel en waarde thay
$res->succes = false;
Antwoord 7
Probeer dit:
ini_set('error_reporting', E_STRICT);
Antwoord 8
Ik had een soortgelijk probleem en dit lijkt het probleem op te lossen. U hoeft alleen het $res-object naar een klasse te initialiseren. Stel dat hier de klassenaam test is.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Antwoord 9
Een eenvoudige manier om deze fout te krijgen, is door (a) hieronder te typen, wat betekent (b) te typen
(a)$this->my->variable
(b)$this->my_variable
Tviaal, maar heel gemakkelijk over het hoofd gezien en moeilijk te herkennen als je er niet naar op zoek bent.
Antwoord 10
Mogelijk moet u controleren of de variabele is gedeclareerd en het juiste type heeft.
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;
Zie PHP anonieme klassen.
Antwoord 11
Probeer het volgende te gebruiken:
$user = (object) null;
Antwoord 12
Ik had een soortgelijk probleem toen ik een variabele probeerde toe te voegen aan een object dat werd geretourneerd door een API. Ik was de gegevens aan het herhalen met een foreach-lus.
foreach ( $results as $data ) {
$data->direction = 0;
}
Dit veroorzaakte de uitzondering “Standaardobject maken van lege waarde” in Laravel.
Ik heb het opgelost met een heel kleine verandering.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Door $data eenvoudigweg een referentie te maken.
Ik hoop dat iemand er iets aan heeft, want ik was verdomd irritant!
Antwoord 13
Dit is een waarschuwing die ik tegenkwam in PHP 7, de makkelijke oplossing hiervoor is door de variabele te initialiseren voordat je deze gebruikt
$myObj=new \stdClass();
Als je het eenmaal hebt geïnitialiseerd, kun je het voor objecten gebruiken
$myObj->mesg ="Welcome back - ".$c_user;
Antwoord 14
nee dat doe je niet.. het zal het maken wanneer je de succeswaarde aan het object toevoegt. De standaardklasse wordt overgenomen als je er geen opgeeft.
Antwoord 15
Dit probleem wordt veroorzaakt doordat u een object toewijst dat niet is gestart. Voor bijv.:
Uw zaak:
$user->email = '[email protected]';
Oplossing:
$user = new User;
$user->email = '[email protected]';
Antwoord 16
Ik plaatste het volgende bovenaan het defecte PHP-bestand en de fout werd niet langer weergegeven:
error_reporting(E_ERROR | E_PARSE);