başlayan oop php soru: Kurucular girişken gerçekleşecek mi?

2 Cevap php

I'm working through this tutorial: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php

İlk başta o sınıfın bir belirleyici ve alıcı yöntemi oluşturmak etti:

<?php

class person{
    var $name;      

    function set_name($new_name){
        $this->name=$new_name;
    }

    function get_name(){
        return $this->name;
    }
}

php?>

Ve sonra nesne oluşturmak ve sonuçları echo:

<?php 
    $stefan = new person();
    $jimmy  = new person();

    $stefan ->set_name("Stefan Mischook");
    $jimmy  ->set_name("Nick Waddles");

    echo "The first Object name is: ".$stefan->get_name();
    echo "The second Object name is: ".$jimmy->get_name();

?>

Beklendiği gibi çalışır, ve anlıyorum.

Sonra Kurucular tanıttı:

class person{
    var $name;

    function __construct($persons_name) {       
        $this->name = $persons_name;        
    }       

    function set_name($new_name){
        $this->name=$new_name;
    }

    function get_name(){
        return $this->name;
    }
}

Ve şöyle verir:

<?php 

    $joel   = new person("Joel");

    echo "The third Object name is: ".$joel->get_name();
?>

Bu tüm iyi ve mantıklı.

Sonra ikisini birleştirmek için çalıştı ve bir hata var, bu yüzden her zaman bir "olsun" fonksiyonunun yer alan bir kurucu meraklı-bir ben? Eğer bir kurucu varsa bir nesne oluştururken, her zaman bir argüman dahil etmek gerekiyor?

Hatalar veriyor:

<?php 
    $stefan = new person();
    $jimmy  = new person();
    $joel   = new person("Joel Laviolette");
    $stefan ->set_name("Stefan Mischook");
    $jimmy  ->set_name("Nick Waddles");

    echo "The first Object name is: ".$stefan->get_name();
    echo "The second Object name is: ".$jimmy->get_name();
    echo "The third Object name is: ".$joel->get_name();
?>

2 Cevap

Yapıcı parametreleri gerekli çünkü bu size hataları veriyor. Bir parametre isteğe yapmak için böyle bir varsayılan değer vermek

function __construct($persons_name=null) {
    if ($persons_name) {
        $this->set_name($persons_name);//use the setter in the constructor.
    }      
}

Bu şimdi çalışacaktır

$stefan = new person();
$stefan ->set_name("Stefan Mischook");
$joel   = new person("Joel Laviolette");
echo "The first Object name is: ".$stefan->get_name();
echo "The second Object name is: ".$joel->get_name();

Yapıcı bir nesneyi başlatmak için kullanılır. Nesne yönelimli programlama beklenti, geçerli bir devlet olmadığı sürece bir nesne yok gerektiğidir. Örneğin, bir ilk ve son isim olmadan bir kişi geçerli bir varlık olarak kabul edilemez olabilir, bu yüzden nesne ilk oluşturulduğunda yapıcı bir adı ve soyadı ile başlatılmış olmalıdır.

Yapıcı bir gerekli parametre vardır, çünkü bir hata var nedeni, bu yüzden bunu bir argüman geçmelidir.

P.S. Gerçekten "Köpek-Bir Memeli" gibi benzetmeler kullanmayı deneyin nesne yönelimli programlama açıklamalarını nefret ediyorum. Muhtemelen uzak bu örneklerden uzak durmalısınız. Onlar gerçekten gerçek dünya programlama hiçbir yararlı bilgi vermek ve hatta bazen öğrencilere öğretilen şeyin nasıl kullanılacağını anlamak izlenimi vermek.

Eğer geçerli bir durumda bir nesne oluşturmak için bir kurucu kullanarak pratik bir uygulama arıyorsanız, sebat için bir veritabanı kullanan bir blog yazısı düşünün.

Örneğin, hiçbir nokta bir uzun yazı yazma ve daha sonra blog ilk veritabanına bir başvuru ile başlatılmadı ise $BlogPost->save(); çağrı olacaktır. Bu durumda, bir yapılandırıcı kullanmak yerine, belki de uygulama olacaktır

$BlogPost = new BlogPost($Database);

Bu yazmak için hiçbir mantıklı olur:

$BlogPost->setDatabase($Database);

Eğer onunla bir şey yapmak istedim her zaman. Belki bir kez yazmak için unutmak istiyorum ve 30 dakika yazma harcanan sonrası nereye kaybolduğunu merak olurdu. Geçersiz bir devletin bir örnek.

Fikir yerine nesne geçersiz bir durumda olma olasılığı riske, sınıf ilk başlatıldığında bağlıdır şey dahil konum olmasıdır.

Edit: biri 'iki parametre' düzeltildi.