PHP 7.1.3 Foreach для дочернего класса, созданного со статическими свойствами, выводит неожиданный вывод - PullRequest
1 голос
/ 03 мая 2019

Я работаю с 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 (), а затем клонирую и сбрасываю объект, так почему первый объект переопределяется вторым объектом?

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