Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Notice: Undefined property (ООП) (https://javascript.ru/forum/server/76552-notice-undefined-property-oop.html)

garrip91 21.01.2019 23:09

Notice: Undefined property (ООП)
 
Составил такой код:

interface Say {
		public function say();
	}
	
	abstract class Animal implements Say {
		
		private $name;
		private $nickname;
		private $coloring;
		private $breed;
		private $age;
		
		public function __construct($name, $nickname, $coloring, $breed, $age) {
			$this->name = $name;
			$this->nickname = $nickname;
			$this->coloring = $coloring;
			$this->breed = $breed;
			$this->age = $age;
		}
		
		public function getName() {
			return $this->name;
			return $this->nickname;
			return $this->coloring;
			return $this->breed;
			return $this->age;
		}
		
	}
	
	class Dog extends Animal {
		
		public function __construct($name, $nickname, $coloring, $breed, $age) {
			parent:: __construct($name, $nickname, $coloring, $breed, $age);
		}
		
		public function say() {
			echo "Я - ".$this->getName()." ".$this->coloring." окраса, "."породы - ".$this->breed.", зовут меня - ".$this->nickname.", мне сейчас ".$this->age;
		}
	
	}
	
	class Cat extends Animal {
		
		public function __construct($name, $nickname, $coloring, $breed, $age) {
			parent:: __construct($name, $nickname, $coloring, $breed, $age);
		}
		
		public function say() {
			echo "Я - ".$this->getName()." ".$this->coloring." окраса, "."породы - ".$this->breed.", зовут меня - ".$this->nickname.", мне сейчас ".$this->age;
		}
		
	}
	
	$dog = new Dog('собака', 'Рекс', 'белого', 'Немец', '5 лет'); 
	$dog->say();
	
	echo "<br><br>";
	
	$cat = new Cat('кошка', 'Маркиза', 'пятнистого', 'Сфинкс', '2 года'); 
	$cat->say();




Данный код выдаёт ошибки следующего содержания:

1. " Notice: Undefined property: Dog::$coloring in C:\xampp\htdocs\www\beonmax.com\PHP\Object_oriente d_programming\Homework_for_video_lesson_68_syntax. php on line 41 ";
2. " Notice: Undefined property: Dog::$breed in C:\xampp\htdocs\www\beonmax.com\PHP\Object_oriente d_programming\Homework_for_video_lesson_68_syntax. php on line 41 "
... и т.д...

В чём моя ошибка? Вроде всё правильно делаю.

Malleys 22.01.2019 01:13

Вы не можете наследовать private свойства, только protected или public! Если вы хотите обратиться к ним из наследованного класса, то измените на protected, так что они станут доступны.

Запустить
<?php

interface Say {
	public function say();
}

abstract class Animal implements Say {
	protected $name;
	protected $nickname;
	protected $coloring;
	protected $breed;
	protected $age;

	public function __construct($name, $nickname, $coloring, $breed, $age) {
		$this->name = $name;
		$this->nickname = $nickname;
		$this->coloring = $coloring;
		$this->breed = $breed;
		$this->age = $age;
	}
}

class Dog extends Animal {
	public function say() {
		return "Я - {$this->name} {$this->coloring} окраса, породы - {$this->breed}, зовут меня - {$this->nickname}, мне сейчас {$this->age}";
	}
}
class Cat extends Animal {
	public function say() {
		return "Я - {$this->name} {$this->coloring} окраса, породы - {$this->breed}, зовут меня - {$this->nickname}, мне сейчас {$this->age}";
	}
}

$dog = new Dog('собака', 'Рекс', 'белого', 'Немец', '5 лет'); 
echo $dog->say();

echo "<br><br>";

$cat = new Cat('кошка', 'Маркиза', 'пятнистого', 'Сфинкс', '2 года'); 
echo $cat->say();

?>

Nexus 22.01.2019 09:40

garrip91, обратите также внимание на то, что Malleys удалил из вашего кода конструкторы классов Dog и Cat.
Нет никакого смысла создавать конструктор у этих классов только для того, чтобы вызвать конструктор родителя, он и так будет вызван.

В методе getName класса Animal будет возвращено только значение свойства name, все остальные возвращения никогда не будут выполнены, т.е. их можно удалить.


Часовой пояс GMT +3, время: 01:11.