Standaard object maken van lege waarde in PHP?

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 $resobject declareren?


Antwoord 1, autoriteit 100%

Uw nieuwe omgeving heeft mogelijk E_STRICT-waarschuwingen ingeschakeld in error_reportingvoor PHP-versies <= 5.3.x, of gewoon error_reportinghebben ingesteld op ten minste E_WARNINGmet PHP-versies >= 5.4. Die fout wordt geactiveerd wanneer $resNULLis 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 $resal 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 successtoewijzen, moet u $resdeclareren als een object van stdClassin de globale naamruimte:

$res = new \stdClass();
$res->success = false;

Antwoord 2, autoriteit 9%

Dit bericht is E_STRICTvoor 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

  1. Denk eerst dat je een object moet maken
    $res = nieuw \stdClass();

  2. 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);

Other episodes