начало ООП php вопрос: конструкторы занимают место метода считывания?

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

Сначала он сделал, чтобы Вы создали метод установщика и метод получателя в классе:

name=$new_name;
    }

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

php?>

И затем Вы создаете объект и повторяете результаты:

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

И возвраты как так:

get_name();
?>

Это - весь штраф и имеет смысл.

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

Дает ошибки:

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

5
задан Joel 15 August 2013 в 14:45
поделиться

2 ответа

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

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();
6
ответ дан 13 December 2019 в 19:23
поделиться

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

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

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

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

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

$BlogPost = new BlogPost($Database);

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

$BlogPost->setDatabase($Database);

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

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

Правка: Исправлены 'два параметра' на один.

5
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: