Поймите некоторый код, используя абстрактный класс в php
Я понимаю концепцию абстрактного класса, но я увидел в книге код, который мне не понятен.
Я кратко код и хотел бы, чтобы вы помогли мне понять, я знаю, что он делает, я просто не знаю, почему работает.
Здесь я объявил и абстрактный класс DataObject и его конструктор
abstract class DataObject {
protected $data = array();
public function __construct( $data ){
foreach ( $data as $key => $value )
{
if( array_key_exists( $key, $this->data ))
$this->data[$key] = $value;
}
}
}
Тогда у меня есть это
class Member extends DataObject {
protected $data = array(
"username" => "",
"password" => ""
);
public function getInfo(){
echo "Usernarme: " . $this->data["username"] . " <br/>password: " . $this->data["password"];
}
}
Поэтому, когда я делаю это
$m= new Member( array(
"username" => "User",
"password" => "Some password" )
);
$m->getInfo();
я получил
Usernarme: Пользователь
пароль: какой-то пароль
Чтобы быть более конкретным.
Похоже, поскольку я не создал конструктор для расширенного класса, он неявно вызывает класс отца, верно?
Как конструктор работает так, что он проверяет массив данных в соответствии со значениями массива Member? Я имею в виду, если при создании объекта
$ m = новый член (массив ( "username" => "User", "password" => "Some password"));
Измените ключ "username" на "usernames", например, ему не будет присвоено значение "User".
Спасибо
2 ответа
В родительском конструкторе:
if( array_key_exists( $key, $this->data ))
$this->data[$key] = $value;
Это предотвращает создание новых ключей. В дочернем классе определены ключи "username" и "password", так что это единственные ключи, которые конструктор позволит записать.
Похоже, поскольку я не создал конструктор для расширенного класса, он неявно вызывает класс отца, верно?
Не явно, но явно. "Не создавая конструктор", вы не перекрыли существующий.
Как конструктор работает так, что он проверяет массив данных в соответствии со значениями массива Member? Я имею в виду, если при создании объекта
$m= new Member( array( "username" => "User", "password" => "Some password" ) );
Измените ключ "username" на "usernames", например, ему не будет присвоено значение "User".
Да. Поскольку в родительском классе вы определяете, что значение должно быть установлено только, если ключ существует, несуществующий ключ "usernames" молча опускается.