Новичок, только учусь, за написание прошу не пинать. Собственно проблема: не понимаю, почему в $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);
?>
Исправил немного. Теперь создается столько инстанций, сколько ты укажешь через 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) "рычит"
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
В переменную $phpWord я запихнул файлКак мне в конец файла добавить новую строку (строки)?