Sınıf Destekleme başaramamak

3 Cevap php

Ben bazı sorunları geçersiz bir parametre örnekleme sırasında verilir eğer benim nesne incelikle başarısız alma yaşıyorum. Ben bir yerde ben sadece taze gözleri gerektiğini, küçük bir sözdizimi şey bir his var. Herhangi bir yardım mutluluk daha fazladır.

class bib {
   protected $bibid;
   public function __construct($new_bibid) {
      if(!$this->bibid = $this->validate_bibid($new_bibid)) {
  	    echo 'me';
	    return false;
      }
      //carry on with other stuff if valid bibid
    }

    private static function validate_bibid($test_bibid) {
	   //call this method every time you get a bibid from the user
	   if(!is_int($test_bibid)) {
		    return false;
	   }
	   return (int)$test_bibid;
    }
 }

Ben yanlış dönen, aslında olduğunu göstermek için orada bir 'eko ben' çizgi var unutmayın. Aşağıdaki gibi benim PHP Bu arıyorum yoludur:

if(!$bib=new bib('612e436')) {
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

Bu yukarıdan beni çıktılar, ama sonra geçerli bir nesne ile yapmak niyetinde ne yapıyor, başka bir bloğa devam eder.

Herkes nokta şey orada yanlış yapıyorum miyim?

Teşekkürler!

3 Cevap

Sen PHP bir kurucu döndüremez - nesne hala normal şekilde oluşturulur.

Bir fabrika ya da benzer bir şey kullanabilirsiniz;

if(!$bib = Bib_Factory::loadValidBib('612e436')){
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

Veya yapıcı bir özel durum ve bunun yerine eğer deyimi bir try catch kullanın.

Ben bu kodu çeşitli sorunlara bakın.

  • Her şeyden önce, ben böyle bir şey yapmak istiyorum düşünüyorum:

    $myBib=new bib(); if($myBib->validate_bibid('612e436')) { ..do stuff.. }

    (Veya benzeri)

    Bu __ construct normal bir yöntem değildir hatırlıyorum. Bu yapıcı, ve bir şey vermemelidir. Zaten örtülü yaptığınız yeni örneğine bir başvuru verir.

  • İkinci olarak, validate_bibid bir boolean veya bir tamsayı döndüren. O acil sorunların almazsınız, ama ben şahsen tarzı sevmiyorum.

  • Üçüncü olarak, korumalı üyesi $ bibid ilan ettik, ama her yerde bunu ayarlamak veya başvuru yok. Ben örneğin yapıcısı ayarlanması beklersiniz. Bundan sonra sadece herhangi bir argüman olmadan validate_bibid arayabilirsiniz.

Bazı garip yapıları vardır ve bu nedenle normal bir şekilde davranırlar çünkü Bu kod parçası belli ki aklını karıştırıyor. Ben yeniden düşünmeye ve sıfırdan bu parça yeniden öneririm.

Update:

Başka bir konu:

Ben bu çizgi öyle düşünüyorum ne yapar sanmıyorum:

 if(!$this->bibid = $this->validate_bibid($new_bibid)) {

Muhtemelen bu demek:

 if(!$this->bibid == $this->validate_bibid($new_bibid)) {

 // Or even better:

 if($this->bibid <> $this->validate_bibid($new_bibid)) {

kesinlikle, sen == yerine bir atama operasyonu = ile karşılaştırma olması gerekir.