Yanıtlar:
Yeni ortamınızda, <= 5.3.x PHP sürümleri için E_STRICTuyarılar etkinleştirilmişerror_reporting olabilir veya error_reportingen azından E_WARNINGPHP => 5.4 sürümleriyle ayarlanmış olabilir . O zaman hata tetiklenir $resolduğu NULLveya henüz başlatılmadı:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP $reszaten bir değere başlatılmışsa ancak bir nesne değilse farklı bir hata mesajı verecektir :
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Genel bir nesne oluşturmaya ve özelliği atamaya çalıştığınızı varsayarsak E_STRICT, PHP 5.4'ten önceki standartlara veya E_WARNINGPHP> = 5.4'teki normal hata düzeyine uymak için , genel ad alanında bir nesne olarak successbildirmeniz gerekir :$resstdClass
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();. Aksi takdirde, bu kod "eski PHP" örtük nesne oluşturma yerine eşdeğer bir alternatif değildir.
Bu ileti E_STRICTPHP <= 5.3 için yapılmıştır. PHP 5.4'ten beri şanssız olarak değiştirildi E_WARNING. Yana E_WARNINGmesajlar faydalıdır, bunları tamamıyla devre dışı bırakmak istemiyoruz.
Bu uyarıdan kurtulmak için şu kodu kullanmalısınız:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Bu tamamen eşdeğer bir alternatiftir . PHP'nin sessizce yaptığı şeyi - şimdi uyarı ile talihsiz bir şekilde - örtük nesne oluşturma ile tam olarak aynı şeyi garanti eder. Kesinlikle olmadığından emin değilseniz, nesnenin zaten var olup olmadığını her zaman kontrol etmelisiniz. Michael tarafından sağlanan kod genel olarak iyi değildir, çünkü bazı bağlamlarda nesne, koşullara bağlı olarak bazen kodda aynı yerde zaten tanımlanmış olabilir.
Undefined variable: res.
basitçe,
$res = (object)array("success"=>false); // $res->success = bool(false);
Veya sınıfları aşağıdakilerle başlatabilirsiniz:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
ve değerleri şununla doldur:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Daha fazla bilgi: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();için çalışmıyor, hala uyarı var. Not: $this->routemevcut.
"@" Karakterini satırın başına koyarsanız, PHP bu satır için herhangi bir uyarı / uyarı göstermez. Örneğin:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Bu satır için bu uyarıyı önlemek için satırın "@" karakterini şöyle başlatmanız gerekir:
@$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
Bu hileyi gelişirken kullanıyorum. Uyarıları doğru işlemezseniz, tüm uyarı mesajlarını devre dışı bırakmayı sevmem, o zaman gelecekte büyük bir hata haline gelecektir.
Diziniz varsa ve buna nesne eklerseniz bunu deneyin.
$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.
}
Bu , daha sonra kullanılmak üzere ARRAY of Objects gönderir ~!
Bunu dene:
ini_set('error_reporting', E_STRICT);
E_STRICT, iletilerin önemli hatalar için bastırılması da dahil olmak üzere hatalar dışındaki tüm hata raporlarını devre dışı bırakır . Bu özel uyarıyı çözmek için makul bir öneri değildir ve dahası, neredeyse hiç yapmak istemediğiniz bir şeydir. Neden 5 kişi bunu onayladı, hiçbir fikrim yok.
ini_set('error_reporting', -1);hata ayıklama sırasında kullanın , ancak her zamanki gibi yukarıdakileri kullanmayın.
Benzer bir sorunum vardı ve bu sorunu çözüyor gibi görünüyor. Sadece $ res nesnesini bir sınıfa başlatmanız gerekir. Burada sınıf adının test olduğunu varsayalım.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Bu, PHP 7'de karşılaştığım bir uyarı, bunu düzeltmek için kullanmadan önce değişkeni başlatmak
$myObj=new \stdClass();
Bir kez intialize ettikten sonra nesneler için kullanabilirsiniz
$myObj->mesg ="Welcome back - ".$c_user;
Bu sorun, başlatılmamış bir nesne örneğine atadığınız için oluşur. Örneğin:
Senin durumun:
$user->email = 'exy@gmail.com';
Çözüm:
$user = new User;
$user->email = 'exy@gmail.com';
Bu hatayı almanın basit bir yolu, aşağıdaki (a) türünü, yani (b) türünü yazmaktır
(A) $this->my->variable
(B) $this->my_variable
Önemsiz, ama çok kolay gözden kaçan ve eğer aramıyorsanız bulmak zor.
_ve->
Değişkenin bildirildiğini ve doğru türde olup olmadığını kontrol etmeniz gerekebilir.
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 anonim sınıflarına bakın .
Bir API döndürülen bir nesneye bir değişken eklemek çalışırken benzer bir sorun vardı. Bir foreach döngüsü ile veri üzerinden yineleme yapıyordum.
foreach ( $results as $data ) {
$data->direction = 0;
}
Bu, Laravel'de "Boş değerden varsayılan nesne oluşturma" Özel Durumunu attı.
Çok küçük bir değişiklikle düzelttim.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Sadece $ data bir referans yapmak.
Umarım bu birine yardım eder, bu beni cehenneme sataştırdı!
İlk önce $ res = new \ stdClass ();
sonra anahtar ve değeri thay $ res-> success = false olan bir nesne atayın;
thay.) Bazı içeriklerden sonra satır sonu olmasını istediğinizde, aradan önce satırın görünür içeriğine iki boşluk ekleyin.
hayır yapmazsınız .. nesneye başarı değerini eklediğinizde bunu oluşturur. bir tane belirtmezseniz varsayılan sınıf devralınır.
Kullanmayı deneyin:
$user = (object) null;
$res?