Вопросы и ответы о php: конструкторы занимают место геттеров? - PullRequest
5 голосов
/ 15 мая 2010

Я работаю через этот урок: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php

Сначала он попросит вас создать метод установки и получения в классе:

<?php

class person{
    var $name;      

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

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

php?>

А затем вы создаете объект и выводите результаты:

<?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();

?>

Работает как положено, и я понимаю.

Затем он вводит конструкторов:

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;
    }
}

И возвращается так:

<?php 

    $joel   = new person("Joel");

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

Это все хорошо и имеет смысл.

Затем я попытался объединить два и получил ошибку, поэтому мне любопытно - конструктор всегда занимает место функции "get"? Если у вас есть конструктор, вам всегда нужно включать аргумент при создании объекта?

выдает ошибки:

<?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 ]

6 голосов
/ 15 мая 2010

Это дает вам ошибки, потому что конструктор имеет обязательные параметры. Чтобы сделать параметр необязательным, присвойте ему значение по умолчанию, например:

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

теперь это будет работать

$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();
5 голосов
/ 15 мая 2010

Конструктор используется для инициализации объекта. Ожидается, что в объектно-ориентированном программировании объект не должен существовать, если он не находится в допустимом состоянии. Например, Person без имени и фамилии может не считаться допустимым объектом, поэтому при первом создании объекта его следует инициализировать с помощью имени и фамилии в конструкторе.

Причина, по которой вы получили ошибку, заключается в том, что в конструкторе есть обязательный параметр, поэтому вы должны передать ему аргумент.

P.S. Я действительно ненавижу объяснения объектно-ориентированного программирования, которые пытаются использовать аналогии, такие как "Dog is-a Mammal". Вы, вероятно, должны держаться подальше от этих примеров. Они действительно не дают полезной информации в программировании в реальном мире, а иногда даже дают учащимся иллюзию, что они понимают, как использовать то, чему их учат.

Если вы ищете практическое применение использования конструктора для создания объекта в допустимом состоянии, представьте сообщение в блоге, в котором для сохранения используется база данных.

Например, не было бы смысла писать длинный пост и затем вызывать $BlogPost->save();, если блог не был инициализирован сначала со ссылкой на базу данных. Применение конструктора в этом случае, возможно, будет

$BlogPost = new BlogPost($Database);

Нет смысла писать:

$BlogPost->setDatabase($Database);

каждый раз, когда ты хотел что-то с этим сделать. Возможно, вы забудете написать это один раз, и вам будет интересно, куда исчезла запись, на которую вы потратили 30 минут. Это пример недопустимого состояния.

Идея состоит в том, что вы включаете все, от чего зависит класс, когда он впервые инициализируется, вместо того, чтобы рисковать возможностью того, что объект находится в недопустимом состоянии.

Редактировать: исправлены два параметра к одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...