Почему в создается 2 одинаковых экземпляра класса вместо двух разных

123
14 мая 2019, 08:40

Новичок, только учусь, за написание прошу не пинать. Собственно проблема: не понимаю, почему в $lions создается 2 одинаковых экземпляра класса, вместо двух разных. Расставил var_dump'ы, обнаружил, что это происходит в конструкторе класса Cage, в цикле, на второй итерации, причем на первой с классом всё в порядке, а на второй класса два, как и должно быть, но они почему-то одинаковые. Как это вообще возможно? Ниже оставляю код, заранее спасибо.

<?php
        trait Names{
            public $f_names = array('Josh', 'Carl', 'Charlie', 'Cooper', 'Duke', 'Toby', 'James', 'Star');
            public $m_names = array('Bella','Lucy','Brigitte','Luna','Sophie','Sadie','Daisy','Molly');
            public function getName($gender){
                if ($gender === 1)
                    return $this->f_names[rand(0,count($this->f_names)-1)];
                else
                    return  $this->m_names[rand(0,count($this->m_names)-1)];
            }
        }
        abstract class Animal{
            use Names;
            public $type;
            public $name;
            public $gender;
            public $age;
            private $activity = Array("играет","ест","бегает","плавает","ворочается","рычит","пьет","спит");
            public function getInf(){
                echo "Вид: ".$this->type."<br>";
                echo "Имя: ".$this->name."<br>";
                echo "Пол: ".$this->gender==1?"мужской":"женский"."<br>";
                echo "Возраст: ".$this->age."<br>";
            }
            // public function getName(){
            //  return $this->name;
            // }
            public function getActivity(){
                return $this->activity[rand(0,count($this->activity)-1)];
            }
            public function create(){
                $this->gender = rand(0,1);
                $this->name = $this->getName($this->gender);
                $this->age = rand(1,7);
                echo "в классе: ".$this->name."<br>";
            }
            public function __construct($type){
                $this->type = $type;
                // $this->gender = rand(0,1);
                // $this->name = $this->getName($this->gender);
                // $this->age = rand(1,7);
            }
        }
        class Lion extends Animal{
        }
        class Zebra extends Animal{
        }
        class Tiger extends Animal{
        }
        class Cage{
            public $animals;
            public function ini(){
                for ($i = 0; $i < count( $this->animals ); $i++) { 
                    // var_dump($this->animals[$i]->name);
                    // echo "<br>";
                    $array[$i] = $this->animals[$i]->name;
                }
                //$array[$this->animals[0]->type] = $array; 
                return $array;
            }
            public function __construct($animal,$amount){
                for ($i = 0; $i < $amount; $i ++) { 
                    $this->animals[$i] = $animal;
                    $this->animals[$i]->create(); 
                    echo '<pre>';
                    var_dump($this->animals);
                    echo '</pre>';
                    echo "<br>";
                }
                echo '<pre>';
                var_dump($this->animals);
                echo '</pre>';
            }
        }

        $lions = new Cage(new Lion("Лев"),2);
?>
Answer 1

Исправил немного. Теперь создается столько инстанций, сколько ты укажешь через amount

Есть моменты которые непонятны?

Код

<?php
/**
 * Interface AnimalCan.
 */
interface AnimalCan
{
    /**
     * Показывает информацию о "созданном" животном
     */
    public function getInf(): void;
    /**
     * Создает новое животное и устанавливает у него параметры.
     *
     * @return mixed
     */
    public function create();
}
/**
 * Class Animal.
 */
abstract class Animal implements AnimalCan
{
    /**
     * Class constants.
     *
     * @var array
     */
    protected const
        F_NAMES  = ['Josh', 'Carl', 'Charlie', 'Cooper', 'Duke', 'Toby', 'James', 'Star'],
        M_NAMES  = ['Bella', 'Lucy', 'Brigitte', 'Luna', 'Sophie', 'Sadie', 'Daisy', 'Molly'],
        ACTIVITY = ['играет', 'ест', 'бегает', 'плавает', 'ворочается', 'рычит', 'пьёт', 'спит'],
        GENDERS  = ['мужской', 'женский'];
    /**
     * @var string
     */
    public $name;
    /**
     * @var int
     */
    public $gender;
    /**
     * @var int
     */
    public $age;
    /**
     * @var string
     */
    public $activity;
    /**
     * У каждого свой.
     * Зебра не может быть львом.
     *
     * @var string
     */
    protected $type;
    /**
     * Создание животного.
     *
     * @return $this|mixed
     */
    public function create()
    {
        $this->setGender()
            ->setName()
            ->setAge(7)
            ->setActivity();
        return $this;
    }
    /**
     * Возвращает информацию.
     */
    public function getInf(): void
    {
        echo '<pre>';
        print_r($this->toArray());
        echo '</pre>';
    }
    /**
     * Возвращает имя животного.
     *
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }
    /**
     * Устанавливает имя животного.
     *
     * @param int $value
     *
     * @return $this
     */
    public function setName($value = 1): self
    {
        $obj = $this->gender === $value
            ? static::F_NAMES
            : static::M_NAMES;
        $this->name = $obj[\array_rand($obj)];
        return $this;
    }
    /**
     * Возвращает тип животного.
     *
     * @return string
     */
    public function getType(): string
    {
        return $this->type;
    }
    /**
     * Возвращает пол.
     *
     * @return int
     */
    public function getGender(): int
    {
        return $this->gender;
    }
    /**
     * Возвращает строковое значение пола животного.
     *
     * @return string
     */
    public function getGenderName(): string
    {
        return static::GENDERS[$this->gender];
    }
    /**
     * Устанавливает пол животного.
     *
     * @param int $value
     *
     * @return $this
     */
    public function setGender($value = 1): self
    {
        $this->gender = \random_int(0, $value);
        return $this;
    }
    /**
     * Возвращает активность.
     *
     * @return string
     */
    public function getActivity(): string
    {
        return $this->activity;
    }
    /**
     * Устанавливает активность.
     *
     * @return $this
     */
    public function setActivity(): self
    {
        $this->activity = static::ACTIVITY[\array_rand(static::ACTIVITY)];
        return $this;
    }
    /**
     * Возвращает возраст
     *
     * @return int
     */
    public function getAge(): int
    {
        return $this->age;
    }
    /**
     * Устанавливает возраст
     *
     * @param $value
     *
     * @return $this
     */
    public function setAge($value): self
    {
        $this->age = random_int(1, $value);
        return $this;
    }
    /**
     * Возвращает массив характеристик.
     *
     * @return array
     */
    protected function toArray(): array
    {
        return [
            'Вид'        => $this->getType(),
            'Имя'        => $this->getName(),
            'Пол'        => $this->getGenderName(),
            'Возраст'    => $this->getAge(),
            'Активность' => $this->getActivity(),
        ];
    }
}
/**
 * Class Lion.
 */
class Lion extends Animal
{
    /**
     * @var string
     */
    protected $type = 'Лев';
}
/**
 * Class Zebra.
 */
class Zebra extends Animal
{
    /**
     * @var string
     */
    protected $type = 'Зебра';
}
/**
 * Class Tiger.
 */
class Tiger extends Animal
{
    /**
     * @var string
     */
    protected $type = 'Тигра';
}
/**
 * Class Cage.
 */
class Cage
{
    /**
     * @var array
     */
    protected $animals;
    /**
     * Cage constructor.
     *
     * @param AnimalCan $animal
     * @param           $amount
     */
    public function __construct(AnimalCan $animal, int $amount)
    {
        foreach (\range(0, $amount - 1) as $item) {
            $beast                = clone $animal;
            $this->animals[$item] = $beast->create();
            $beast->getInf();
        }
    }
    /**
     * @return array
     */
    public function getAnimals(): array
    {
        return $this->animals;
    }
}

Запуск

$lion = new Lion;
$lions = new Cage($lion, 2);
var_dump($lions->getAnimals());   

Ответ

array(2) {
  [0] =>
  class Lion#6 (5) {
    protected $type =>
    string(6) "Лев"
    public $name =>
    string(8) "Brigitte"
    public $gender =>
    int(0)
    public $age =>
    int(2)
    public $activity =>
    string(20) "ворочается"
  }
  [1] =>
  class Lion#7 (5) {
    protected $type =>
    string(6) "Лев"
    public $name =>
    string(4) "Carl"
    public $gender =>
    int(1)
    public $age =>
    int(6)
    public $activity =>
    string(10) "рычит"
  }
}
READ ALSO
Выполнение функции по нажатию на кнопку

Выполнение функции по нажатию на кнопку

Имеются 2 кнопки c id: button1 и button2

172
PHP sessions AJAX

PHP sessions AJAX

Есть файл indexphp `

138
Как в PHPWord записать текст в конец файла .docx?

Как в PHPWord записать текст в конец файла .docx?

В переменную $phpWord я запихнул файлКак мне в конец файла добавить новую строку (строки)?

119