NULL dönmek için PHP yapıcı

6 Cevap php

Bu kodu vardır. Bir User nesne yapıcı bir şekilde başarısız için mümkündür, böylece $this->LoggedUser bir NULL değeri atanır ve nesne yapıcı döndükten sonra serbest?

$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
  $this->LoggedUser = new User($_SESSION['verbiste_user']);    

6 Cevap

Eğer PHP 5 kullanıyorsanız varsayarsak, yapıcı bir istisna atabilir:

class NotFoundException extends Exception {}

class User {
    public function __construct($id) {
        if (!$this->loadById($id)) {
             throw new NotFoundException();
        }
    }
}

$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false) {
    try {
        $this->LoggedUser = new User($_SESSION['verbiste_user']);
    } catch (NotFoundException $e) {}
}

Açıklık için, statik bir fabrika yöntemi bu sarın:

class User {
    public static function load($id) {
        try {
            return new User($id);
        } catch (NotFoundException $unfe) {
            return null;
        }
    }
    // class body here...
}

$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
    $this->LoggedUser = User::load($_SESSION['verbiste_user']);

Bir kenara, PHP 4, bazı sürümleri Kurucuların içinde NULL $ Bunu ayarlamak için izin ama şimdiye kadar resmi olarak onaylanmış ve 'özelliği' sonunda kaldırılır sanmıyorum.

AFAIK bu yapılamaz, new her nesnenin bir örneğini döndürür.

Ne genellikle bu geçici bir çözüm için ne olduğunu:

  • Bir nesne başarıyla yüklendi veya olup olmadığını belirler nesnesine bir ->valid boolean bayrak ekleme. Yapıcı sonra bayrağı koyacaktır

  • , new komutu çalıştırır başarı veya başarısızlık yok eder ve iadeler false üzerinde yeni bir nesne döndüren bir sarıcı işlevi oluşturma

-

function get_car($model)
      {
        $car = new Car($model);
        if ($car->valid === true) return $car; else return false;
     } 

Ben alternatif yaklaşımlar duymak ilgi duyarım, ama ben hiçbirini bilmiyorum.

Bu şekilde düşünün. Eğer new kullandığınızda, yeni bir nesne olsun. Dönemi. Ne yapıyoruz, varolan bir kullanıcı arar ve bulduğunda onu döndüren bir işlevi olması. Bu ifade için en iyi şey, muhtemelen böyle Kanala :: FINDUSER () gibi bir statik sınıf fonksiyonudur. Bu aynı zamanda bir taban sınıftan derslere kaynaklanan konum ne zaman genişletilebilir.

Bir kurucu bilinmeyen bir nedenle başarısız olduğunda, bir NULL değeri veya YANLIŞ olmaz ama bir istisna atar. PHP5 ile her şeyi ile olduğu gibi. Eğer durum ele yoksa o komut bir yakalanmamış özel durum hata ile yürütme durur.

Bir fabrika burada yararlı olabilir:

class UserFactory
{
  static public function create( $id )
  {
    return (
      filter_var($id, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1)))
        ? new User($id)
        : null
    );
  }
}

belki böyle bir şey:

class CantCreateException extend Exception{
}

class SomeClass {
    public function __construct(){
       if (something_bad_happens) {
          throw (new CantCreateException());
       }
    }
}

try{
  $obj = new SomeClass();
}
catch(CantCreateException e){
   $obj = null;
}
if($obj===null) echo "couldn create object";
//jaz303 stole my idea an wrap it into a static method