2010-02-06 15 views
47

Bu kodu aldım. Bir User nesne yapıcısı bir şekilde başarısız olursa $this->LoggedUserNULL değeri atanır ve constructor geri döndükten sonra nesne serbest bırakılır mı?PHP kurucusu bir NULL döndürmek için

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

Büyük ilk soru. –

+0

Bir kurucuda FALSE döndüren belirli bir popüler CMS gördüm. Ne var ne yok? – loungerdork

+1

Sadece belgelemek için buraya gelmeyi düşündüm. Tarih çok uzak olduğundan, gördüğünüz CMS'nin PHP4 için yapılmış olması mümkündür. PHP4, bir çok kötü şeye izin vermek için kullanılır, en azından kullanıcının adlandırılmış yapıcıda $ 'ın üzerine yazmasına izin vermez (örneğin $ this = false). – techdude

cevap

62

, yapıcı metotta bir istisna atabilir:

Anlaşılır olması için
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) {} 
} 

, statik bu sarabilirdiniz fabrika yöntemi:

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']); 

Ayrıca, PHP 4'ün bazı sürümleri, bunu NUL'ye ayarlamanıza izin verir. Kurucunun içindeyim ama sanırım hiç resmi olarak onaylanmadı ve 'özellik' sonunda ortadan kaldırıldı.

+4

+1 IMO, bu, bir nesne oluşturulmasındaki başarısızlığın doğru OO yoludur. –

+1

Başarısızlığın niteliğine bağlıdır. Bir istisna olsaydı, evet. Yapıcıya bir parametre bir kriteri karşılamıyorsa, aklımda no. –

+5

Pekka, "kötü parametreler" in ne tür bir istisna olmayacağından emin değilim? Belirli bir parametrelerle birlikte geçerli bir nesne oluşturamazsanız, bu kesinlikle istisnadır ve bir istisna atmalıdır? Düşünmekte olduğunuz ayrımı netleştirmek için bir örnek verebilir misiniz? (Aşağıda cevabınızı görüyorsunuz, bu burada yararlı olabilir, ancak yorumunuzu düzenleyemiyorum!) –

11

AFAIK bu yapılamaz, new daima 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 yapılmadığının tespit nesneye bir ->valid boolean bayrak ekleme. Yapıcı, sonra new komutu yürütür bir sarıcı işlevi oluşturma bayrağı

  • set başarısını yeni nesneyi döndürür veya başarısızlık üzerine yok eder ve false

döndürür olacak -

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

Alternatif yaklaşımları duymak isterdim, fakat ben hiç bir şey bilmiyorum.

+0

Netleştirdiğiniz için teşekkür ederiz. Temel olarak, yeni komutu denemek için ...Bir kurucuda yakalamak ve sonra bir istisna yükseltmek? – Tibor

+1

İyi soru! Bence * yapabilirsin, ama bana doğru gelmiyor. "Ford" modeline sahip bir nesne arabası oluşturursam, bu modelin hiçbir aracının veritabanında bulunmaması olabilir. Bu gerçekten ne istisnalar * için tasarlandı değil. Daha fazla beklenen bir durum. Başka hangi cevapların ortaya çıktığını, bununla başa çıkmanın "doğru" bir yol olarak görüldüğünü görmek isterdim. –

+0

bu, kirli şekilde bir şey yapıyor, @ jaz303'ün yanıtını kontrol edin – minhajul

3

Bir kurucu bilinmeyen bir nedenle başarısız olduğunda, bir NULL değeri veya FALSE döndürmez, ancak bir istisna atar. PHP5 ile her şeyde olduğu gibi. Özel durumla başa çıkmazsanız, komut dosyası bir Yakalanmamış Özel Durum hatasıyla yürütülmeyi durduracaktır.

+1

Bir kurucu ne zaman bir istisna atar? Yanlış döndüğünde mi? Yoksa, bir kurucu belirli bir koşul yerine getirilemezse bir istisna atmalı mı demek istiyorsun? –

+1

Yapıcınız istisnayı atmalıdır. – Tom

5

Bu şekilde düşünün. new'u kullandığınızda, yeni bir nesne alırsınız. Dönemi. Yaptığınız şey, mevcut bir kullanıcıyı arayan ve bulunduğunda döndüren bir işleve sahip olmanızdır. Bunu ifade etmenin en iyi yanı, muhtemelen User :: findUser() gibi statik bir sınıf işlevidir. Bu ayrıca, sınıflarınızı bir temel sınıftan türetirken de genişletilebilir.

+0

Bu en mantıklı geliyor, evet. Ben sadece PHP'de OO programlamaya başladım, bu yüzden işleri doğru bir şekilde nasıl halledeceğimi tam olarak bilmiyorum. – Tibor

3
böyle

belki bir şey: PHP 5'i kullanıyorsanız varsayarsak

class CantCreateException extends 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't create object"; 
//jaz303 stole my idea an wrap it into a static method 
4

bir fabrika burada yararlı olabilir: bu arada

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