Я работаю с PHP 7.1.3 локально в Windows с EasyPHP.
Это всего лишь тестовый код , я почти уверен, что что-то здесь не хватает, но мне хотелось бынебольшая помощь для понимания проблемы.
В этом случае краткое объяснение:
У меня есть
- Класс формы для создания форм
- абстрактный класс InputField, используемый для создания общих полей ввода для формы, с общими свойствами и методами для каждого поля
- класс InputFieldText, расширяющий InputField, который должен создавать только входные текстовые поля.
Форма имеет метод addField (array $ attribute) и свойство $ fields = [].
Когда я добавляю поле в форму, я настраиваю атрибуты поля (в этом тесте толькоимя поля), затем я циклически изменяю поля формы с помощью Foreach для вывода каждого поля.
Если я делаю это с открытыми свойствами, это, кажется, работает нормально, я помещаю это здесь только, чтобы показать, что код работает, как я уже сказал, это простопротестируйте, поэтому, пожалуйста, не судите о качестве кода или стандартах:
<?php
// THIS WORKS
class Form
{
public $fields=[];
public function addField($attributes)
{
$field=new InputFieldText();
$field->setAttributes($attributes);
$this->fields[]=clone $field;
unset($field);
}
}
abstract class InputField
{
public $name='';
public function getName()
{
return $this->name;
}
public function setAttributes(array $attributes)
{
$this->name=$attributes['name'];
}
}
class InputFieldText extends InputField
{
}
$form=new Form();
$form->addField(['name'=>'Test1']);
$form->addField(['name'=>'Test2']);
foreach ($form->fields as $k=>$field) {
echo $field->getName();
}
// OUTPUT OK: Test1Test2
?>
Между тем, если я попробую использовать статические свойства, которые, на мой взгляд, были лучше, я получу вывод, который не могу понять:
<?php
// NOT WORKING as I expected
class Form
{
public $fields=[];
public function addField($attributes)
{
$field=new InputFieldText();
$field->setAttributes($attributes);
$this->fields[]=clone $field;
unset($field);
}
}
abstract class InputField
{
public static $name='';
public function getName()
{
return static::$name;
}
public function setAttributes(array $attributes)
{
static::$name=$attributes['name'];
}
}
class InputFieldText extends InputField
{
}
$form=new Form();
$form->addField(['name'=>'Test1']);
$form->addField(['name'=>'Test2']);
foreach ($form->fields as $k=>$field) {
echo $field->getName();
}
// OUTPUT: Test2Test2
?>
Я не понимаю, почему во второй части кода выводим Test2Test2 вместо Test1Test2, как в 1-й части кода.Чего мне не хватает?
По некоторым причинам кажется, что при использовании статических свойств foreach всегда ссылается на последний объект, который, как представляется, перекрывает предыдущие объекты.
Это потому, что static :: $ name = $ attribute ['name'] всегда ссылается на последний созданный объект?Но даже в этом случае я создаю новый InputFieldText каждый раз, когда я делаю addField (), а затем клонирую и сбрасываю объект, так почему первый объект переопределяется вторым объектом?