Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('John');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
echo '<br>';
echo '<hr>';
<?php
abstract class HumanAbstract{
protected $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
abstract public function getGreetings();
abstract public function getMyNameIs();
public function introduceYourself(){
return $this->getGreetings()." ! ".$this->getMyNameIs()." ".$this->getName()." .";
}
}
class RussianHuman extends HumanAbstract{
public function getGreetings(){
return "Привет";
}
public function getMyNameIs(){
return "Меня зовут ";
}
}
class EnglishHuman extends HumanAbstract{
public function getGreetings(){
return "Hello ";
}
public function getMyNameIs(){
return "My name is ";
}
}
$russian = new RussianHuman("Амир");
$english = new EnglishHuman("Amir");
echo $russian->introduceYourself()."<br>";
echo $english->introduceYourself()."<br>";
<?
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
public function getGreetings(): string
{
return 'Привет';
}
}
class EnglishHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getMyNameIs(): string
{
return 'My name is';
}
public function getGreetings(): string
{
return 'Hi';
}
}
$rus = new RussianHuman('Иван');
$rus->introduceYourself();
$en = new EnglishHuman('Bob');
$en->introduceYourself();
?>
class UkraineHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет. ';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi. ';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$ukr = new UkraineHuman('Микола');
$eng = new EnglishHuman('Nikolay');
echo $ukr->introduceYourself();
echo $eng->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameis() . ' ' . $this->getName() . '.';
}
}
class RussianMan extends HumanAbstract
{
public function getGreetings(): string
{
return 'Здравствуйте';
}
public function getMyNameIs(): string
{
return 'Имя моё - ';
}
}
class EnglishMan extends HumanAbstract
{
public function getGreetings(): string
{
return ' Hello my friend';
}
public function getMyNameIs(): string
{
return 'The name of mine is - ';
}
}
$Russia = new russianMan('Петр Первый');
echo '<br>';
$England = new englishMan('Benedict Camberbatch, as you know');
echo $Russia->introduceYourself();
echo $England->introduceYourself();
class RussianHuman extends HumanAbstract {
public function getGreetings(): string {
return 'Привет';
}
public function getMyNameIs(): string {
return 'Мое имя';
}
}
class EnglishHuman extends HumanAbstract {
public function getGreetings(): string {
return 'Hello';
}
public function getMyNameIs(): string {
return 'My name is';
}
}
$nikolay = new RussianHuman('Коля');
$stepan = new RussianHuman('Степка');
echo $nikolay->introduceYourself() . '<br>'; // Привет! Мое имя Коля.
echo $stepan->introduceYourself() . '<br>'; // Привет! Мое имя Степка.
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
$rusObj = new RussianHuman('Игорь');
echo $rusObj->introduceYourself();
echo '<br>';
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$engObj = new EnglishHuman('Mike');
echo $engObj->introduceYourself();
abstract class HumanAbstract {
private $name;
public function __construct(string $name) {
$this->name = $name;
}
public function getName(): string {
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string {
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract {
public function getGreetings(): string {
return 'Привет';
}
public function getMyNameIs(): string {
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract {
public function getGreetings(): string {
return 'Hi';
}
public function getMyNameIs(): string {
return 'My name is';
}
}
$rus = new RussianHuman('Иван');
$eng = new EnglishHuman('Todd');
echo $rus->introduceYourself() . '<br>';
echo $eng->introduceYourself();
Отнаследуйте от него 2 класса: RussianHuman и EnglishHuman.
Реализуйте в них методы getGreetings(), которые будут возвращать приветствие на разных языках, вроде «Привет».
Реализуйте в них методы getMyNameIs(), которые будут возвращать на разных языках слова «Меня зовут».
В итоге метод introduceYourself должен возвращать строку, вроде «Привет! Меня зовут Иван.»
Создайте объекты этих классов и заставьте их поздороваться.
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russianPeople = new RussianHuman('Павел');
$englishPeople = new EnglishHuman('Alex');
echo $russianPeople->introduceYourself();
echo '<br>';
echo $englishPeople->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$men1 = new RussianHuman('Иван');
$men2 = new EnglishHuman('John');
echo $men1->introduceYourself();
echo $men2->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут' ;
}
}
class EnglishMan extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is ' ;
}
}
$russianHuman = new RussianHuman('Никита');
$englishHuman = new EnglishMan('Richard');
echo $russianHuman->introduceYourself();
echo '<br>';
echo $englishHuman->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Ivan');
echo $russian->introduceYourself();
echo $english->introduceYourself();
class RussianHuman extends HumanAbstract
{
public function getGreetings()
{
return 'Привет';
}
public function getMyNameIs()
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings()
{
return 'Hello';
}
public function getMyNameIs()
{
return 'My name is';
}
}
$leha = new RussianHuman('Алексей');
$ben = new EnglishHuman('Ben');
echo $leha->introduceYourself();
echo '<br>';
echo $ben->introduceYourself();
?>
class RussianHuman extends HumansAbstract
{
public function getGreetings(): string
{
echo 'Привет ';
}
public function getMyNameIs(): string
{
echo ' меня зовут ';
}
}
$ivan = new RussianHuman('Иван');
echo $ivan->introduceYourself();
class EnglishHuman extends HumansAbstract
{
public function getGreetings(): string
{
echo 'Hello ';
}
public function getMyNameIs(): string
{
echo 'my name is ';
}
}
$john = new EnglishHuman('Jogn');
echo $john->introduceYourself();
<?php
require_once "HumanAbstract.php";
class EnglishHuman extends HumanAbstract
{
public function getGreetings() : string
{
return 'Hello';
}
public function getMyNameIs() : string
{
return 'my name is';
}
}
RussianHuman
<?php
require_once "HumanAbstract.php";
class RussianHuman extends HumanAbstract
{
public function getGreetings() : string
{
return 'Привет';
}
public function getMyNameIs() : string
{
return 'меня зовут';
}
}
index.php
<?php
require_once "EnglishHuman.php";
require_once "RussianHuman.php";
$engHum = new EnglishHuman('Alex');
$rusHum = new RussianHuman('Алеша');
echo $engHum->introduceYourself();
echo $rusHum->introduceYourself();
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russian = new RussianHuman('Андрей');
$english = new EnglishHuman('Mark');
echo $russian->introduceYourself();
echo $english->introduceYourself();
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Ivan');
echo $russian->introduceYourself().'<br>';
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Василий');
echo $rus->introduceYourself() . '<br>';
$eng = new EnglishHuman('Elton John');
echo $eng->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.' . '<br>';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russianhuman = new RussianHuman('Иван');
echo $russianhuman->introduceYourself();
$englishhuman = new EnglishHuman('Alex');
echo $englishhuman->introduceYourself();
abstract class HumanAbstract
{
protected $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет!';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello!';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Дмитрий');
echo $rus->introduceYourself();
$rus = new EnglishHuman('Дмитрий');
echo $rus->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
abstract public function getGreetings() : string;
abstract public function getMyNameIs() :string;
public function introduceYourself() : string
{
return $this->getGreetings() . $this->getMyNameIs() . ' ' . $this->getName() . '!';
}
}
class RussianHuman extends HumanAbstract
{
private $name;
public function __construct($name)
{
parent::__construct($name);
}
public function getGreetings() : string
{
return 'Привет!';
}
public function getMyNameIs() : string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
private $name;
public function __construct($name)
{
parent::__construct($name);
}
public function getGreetings() : string
{
return 'Halo! ';
}
public function getMyNameIs() : string
{
return 'My name is ';
}
}
$test1 = new EnglishHuman('Max');
$test2 = new RussianHuman('Макс');
echo $test1->introduceYourself();
echo $test2->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName():string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getNameIs(): string;
public function introduseYourself():string
{
return $this->getGreetings() . '! ' . $this->getNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет!';
}
public function getNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello!';
}
public function getNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Петя');
echo $russian->introduseYourself();
echo '<br>';
$english = new EnglishHuman('Arnold');
echo $english->introduseYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Владимир');
$american = new EnglishHuman('Donald');
echo $russian->introduceYourself();
echo '<br>';
echo $american->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name';
}
}
$objectRussian = new RussianHuman('Петя');
$objectEnglish = new EnglishHuman('Jack');
echo $objectRussian->introduceYourself() . '<br>';
echo $objectEnglish->introduceYourself();
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return "Привет";
}
public function getMyNameIs(): string
{
return "Меня зовут";
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russianHuman = new RussianHuman("Таня");
$englishHuman = new EnglishHuman("Tania");
echo $russianHuman->introduceYourself()."<br>";
echo $englishHuman->introduceYourself()."<br>";
Курс для начинающих проходили? Что за подчеркивания в именах переменных?
$russian_human
Должно быть
$russianHuman
"Меня зовут " - пробел в конце. return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.'; - ещё один пробел после $this->getMyNameIs(). Итого на выходе в строке два пробела подряд, а нужен один. Нужно внутри getMyNameIs() убрать пробел в конце.
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return$this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'my name is';
}
}
$russian = new RussianHuman('Русслан');
$english = new EnglishHuman('John');
echo $russian -> introduceYourself();
echo '<br>';
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
protected $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianMan extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет ';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishMan extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello ';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$rus= new RussianMan(Иван);
$eng= new EnglishMan(Tom);
echo $rus->introduceYourself();
echo '<br>';
echo $eng->introduceYourself();
class RussianHuman extends HumanAbstract{
public function getGreetings(): string{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract{
public function getGreetings(): string{
return 'Hallo';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$ivan = new RussianHuman('Иван');
$djon = new EnglishHuman('Jhonny');
echo $ivan->introduceYourself();
echo '<br>';
echo $djon->introduceYourself();
//Homework abstract classes
abstract class HumanAbstract
{
private $name;
public function __construct(string $name){
$this->name = $name;
}
public function getName():string {
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself():string {
return $this->getGreetings().'! '.$this->getMyNameIs(). ' ' .$this->getName().'.';
}
}
class RussianHuman extends HumanAbstract{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$firstPerson = new RussianHuman('Илья');
echo $firstPerson->introduceYourself();
echo '<br>';
$secondPerson = new EnglishHuman('Mark');
echo $secondPerson->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Тимофей');
$eng = new EnglishHuman('Brayan');
echo $rus->introduceYourself() . '<br>';
echo $eng->introduceYourself() . '<br>';
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . ' ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет,';
}
public function getMyNameIs(): string
{
return 'меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello,';
}
public function getMyNameIs(): string
{
return 'my name is ';
}
}
$introduceRussian = new RussianHuman('Игорь');
echo $introduceRussian->introduceYourself();
echo '</br>';
$introduceEnglish = new RussianHuman('Antonio');
echo $introduceEnglish->introduceYourself();
class RussianHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Мое имя';
}
}
class EnglishHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
echo $russian->introduceYourself();
$english = new EnglishHuman('John');
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' '. $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет!';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello!';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$rusGuy = new RussianHuman('Игорь');
$engGuy = new EnglishHuman('John');
echo $rusGuy->introduceYourself();
echo '<br>';
echo $engGuy->introduceYourself();
Отредактировал абстрактный класс, сделав свойство name "protected", чтобы его можно было унаследовать дочерним классам и, помимо этого, использовать parent::__construct($name). Считается ли это правильным для абстрактных классов?
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName();
}
}
class RussianHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ' . $this->name;
}
}
class EnglishHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ' . $this->name;
}
}
$russHuman = new RussianHuman('Виктор');
$englishHuman = new EnglishHuman('Charlie');
echo $russHuman->introduceYourself();
echo '<br>';
echo $englishHuman->introduceYourself();
Наверное я что-то неправильно делаю, но если я сделаю свойство name "private", не изменяя другой код, то получу на выходе
Привет! Меня зовут
Hello! My name is
Потому что напрямую к private-свойству родительского класса доступа нет. Но вы можете достучаться до него через геттер родительского класса, который является публичным.
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return "Утречко!";
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return "Morning!";
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Иван');
$eng = new EnglishHuman('Bob');
echo $rus->introduceYourself();
echo $eng->introduceYourself();
class RusHuman extends Human
{
public function getGreetings(): string
{
return 'Привет'
}
public function getMyNameIs(): string
{
return 'Меня зовут'
}
}
class EngHuman extends Human
{
public function getGreetings(): string
{
return 'Hello'
}
public function getMyNameIs(): string
{
return 'My name is'
}
}
$rus_human = new RusHuman("Чингис");
$eng_human = new EngHuman("Alex");
echo $rus_human->introduceYourSelf();
echo '<br>';
echo $eng_human->introduceYourSelf();
abstract class Human
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RusHuman extends Human
{
public function getGreetings(): string
{
return 'Привет'
}
public function getMyNameIs(): string
{
return 'Меня зовут'
}
}
class EngHuman extends Human
{
public function getGreetings(): string
{
return 'Hello'
}
public function getMyNameIs(): string
{
return 'My name is'
}
}
$rusHuman = new RusHuman("Чингис");
$engHuman = new EngHuman("Alex");
echo $rusHuman->introduceYourSelf();
echo '<br>';
echo $engHuman->introduceYourSelf();
Код целиком.
Спасибо за замечания! В следующий раз буду писать имена переменных в camelCase
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russianHuman = new RussianHuman('Даня');
$englishHuman = new EnglishHuman('Arnold');
echo $russianHuman->introduceYourself();
echo '<br>';
echo $englishHuman->introduceYourself();
echo '<br>';
Все равно путаюсь в реализации, пока не особо понятно, но если код работает, значит все правильно идет.
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Иван');
echo $rus->introduceYourself();
echo '<br>';
$eng = new EnglishHuman('John');
echo $eng->introduceYourself();
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ' . $this->name;
}
}
class EnglishHuman extends HumanAbstract
{
private $name;
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is ' . $this->name;
}
}
$russianIvan = new RussianHuman('Иван');
$englishJhon = new EnglishHuman('Jhon');
echo $englishJhon->introduceYourself() . '<br>';
echo $russianIvan->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class Englishhuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$human1=new RussianHuman('Сергей');
$human2=new Englishhuman('Tom');
echo $human1->introduceYourself().PHP_EOL.'<br>';
echo $human2->introduceYourself();
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russianGreeting = new RussianHuman('Иван');
$englishGreeting = new EnglishHuman('Nick');
echo $russianGreeting->introduceYourself();
echo '<br>';
echo $englishGreeting->introduceYourself();
public function getGreetings() :string {
return $this->greeting;
}
public function getMyNameIs() :string {
return $this->myNameIs;
}
Методы в обоих классах полностью одинаковые. Это значит что они у них общие и их можно вынести в родительский класс, откуда они его оба унаследуют. Но я вам всё же советую перечитать ДЗ, так как это несколько отличается от того, что было нужно сделать.
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Иван');
$eng = new EnglishHuman('John');
echo $rus->introduceYourself();
echo '<br>';
echo $eng->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$human1 = new RussianHuman('Иван');
$human2 = new EnglishHuman('John');
echo $human1->introduceYourself();
echo '<br>';
echo $human2->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Helloy';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Mike');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EspanolHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hola';
}
public function getMyNameIs(): string
{
return 'Me llamo';
}
}
$rus = new RussianHuman('Иван');
echo $rus->introduceYourself() . '<br>';
$esp = new EspanolHuman('Carlos');
echo $esp->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('John');
echo $russian->introduceYourself();
echo "<br>";
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName();
}
}
class RussianHumans extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHumans extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHumans('Соиб');
$english = new EnglishHumans('Liza');
echo $russian->introduceYourself()."\n";
echo $english->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Дмитрий');
$eng = new EnglishHuman('John');
echo $rus->introduceYourself();
echo '</br>';
echo $eng->introduceYourself();
?>
...
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'my name is';
}
}
$e = new EnglishHuman('Jimmy');
$r = new RussianHuman('Иван');
echo $e->introduceYourself() . PHP_EOL;
echo $r->introduceYourself() . PHP_EOL;
abstract class HumanAbstract {
protected $name;
public function __construct(string $name) {
$this->name = $name;
}
public function getName() : string {
return $this->name;
}
abstract public function getGreetings() : string;
abstract public function getMyNameIs() : string;
public function introduceYourself() : string {
return $this->getGreetings() . '! ' . $this->getMyNameIs() . '<br />';
}
}
class RussianHuman extends HumanAbstract {
public function getGreetings() : string {
return 'Привет';
}
public function getMyNameIs() : string {
return 'Меня зовут ' . $this->name;
}
}
class EnglishHuman extends HumanAbstract {
public function getGreetings() : string {
return 'Hello';
}
public function getMyNameIs() : string {
return 'My name is ' . $this->name;
}
}
$russian1 = new RussianHuman('Петя');
$englishman1 = new EnglishHuman('John');
echo $russian1->introduceYourself();
echo $englishman1->introduceYourself();
<?php
trait GetMyNameIsTrait
{
public function getMyNameIs(): string
{
if (__CLASS__ == 'RussianHuman'){
return 'Меня зовут ';
}
return 'My name is ';
}
}
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
use GetMyNameIsTrait;
public function __construct($name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return "Привет! ";
}
}
class EnglishHuman extends HumanAbstract
{
use GetMyNameIsTrait;
public function __construct($name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return "Hello!";
}
}
Да, но только когда код требуется в нескольких не связанных между собой классов. А у вас в трейте прямо происходит привязка к классам - если это класс один, то делай одно, если другой - другое.
спасибо за разъяснение , учту.
А как все таки правильно вызывать конструктор с параметрами родительского класса в дочернем конструкторе класса? если понял верно то параметры передаваемые в конструктор совпадают с родительским конструктором по кол-ву и типу можно не указывать parent. ?
В дочернем конструкторе, как и в любом другом методе, можно расширять конструктор, то есть добавлять новые параметры. Но остальные, которые совпадают по порядку с родительским, нельзя изменять.
При вызове parent::method вызывается родительский метод. Его можно вызывать, а можно и не вызывать. Но если его не вызвать, то код родительского конструктора попросту не выполнится.
Всё вышеописанное касается не только конструкторов, но и вообще любых методов. Потому что конструктор это такой же метод как и все остальные, просто вызывается автоматически при создании класса.
<?php
//...
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Jack');
echo $russian->introduceYourself() . '<br>'; //Привет! Меня зовут Иван.
echo $english->introduceYourself() . '<br>'; //Hello! My name is Jack.
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$Rus1 = new RussianHuman('Иван');
echo $Rus1->introduceYourself() . '<br>';
$Eng1 = new EnglishHuman('Ivan');
echo $Eng1->introduceYourself() . '<br>';
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
abstract public function getGreetings():string;
abstract public function getMyNameIs():string;
public function introduceYourself():string
{
return $this->getGreetings().'! '.$this->getMyNameIs().' '.$this->getName();
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Привет';
}
public function getMyNameIs():string
{
return 'Моё имя ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings():string
{
return 'Hello';
}
public function getMyNameIs():string
{
return 'My name is ';
}
}
$russianHuman = new RussianHuman('Петя');
echo $russianHuman->introduceYourself().'<br/>';
$englishHuman = new EnglishHuman('Georg');
echo $englishHuman->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Артём');
$english = new EnglishHuman('Johnny');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
<?php
abstract class Human
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends Human
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends Human
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Василий');
$english = new EnglishHuman('George');
echo $russian->introduceYourself() . '<br>';
echo $english->introduceYourself();
<?php
//...
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$objectRu = new RussianHuman('Владимир');
$objectEng = new EnglishHuman('Arnold');
echo $objectRu->introduceYourself();
echo '<br>';
echo $objectEng->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string {
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hi';
}
public function getMyNameIs(): string {
return 'My name is';
}
}
$russianHumanName = new RussianHuman('Иван');
$englishHumanName = new EnglishHuman('Ivan');
echo $russianHumanName -> introduceYourself().'<br>';
echo $englishHumanName -> introduceYourself().'<br>';
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ' . $this->name;
}
}
class EnglishHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ' . $this->name;
}
}
$human1 = new RussianHuman('Иван');
$human2 = new EnglishHuman('Jack');
echo $human1->introduceYourself() . '<br>';
echo $human2->introduceYourself();
Добрый вечер.
Честно говоря, назначение абстрактных классов я не понял. Т.е. в д.з. вместо абстрактного вполне можно было использовать и обычный, ничего бы не изменилось.
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract{
public function getGreetings(): string{
return 'Привет';
}
public function getMyNameIs(): string{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract{
public function getGreetings(): string{
return 'Hi';
}
public function getMyNameIs(): string{
return 'My name is ';
}
}
$objectA = new RussianHuman('Данила');
$objectB = new EnglishHuman('Daniel');
echo $objectA->introduceYourself();
echo '<br>';
echo $objectB->introduceYourself();
Здесь в абстрактном классе реализована лишь часть функционала, а в дочерних - другая. При этом в абстрактном используются обращения к еще не реализованным частям, которые могут быть по-разному реализованы в дочерних классах.
Далее в уроках когда дойдем до MVC будут более подходящие примеры.
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$rus = new RussianHuman('Иван');
$eng = new EnglishHuman('George');
echo $rus->introduceYourself();
echo '<br>';
echo $eng->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
public function introduceYourself(): string
{
return parent::introduceYourself(); // TODO: Change the autogenerated stub
}
}
class EnglishHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getMyNameIs(): string
{
return 'My name is ';
}
public function getGreetings(): string
{
return 'Hallo';
}
public function introduceYourself(): string
{
return parent::introduceYourself();
}
}
$manRu1 = new RussianHuman('Иван');
echo $manRu1->introduceYourself();
echo '<br>';
$manEn1 = new EnglishHuman('Bob');
echo $manEn1->introduceYourself();
Прослойка - значит еще один слой кода, лежащий между двумя другими уровнями. Вместо того чтобы напрямую вызвать introduceYourself у HumanAbstract вы определили методы у дочерних классов, которые только и делают, что вызывают родительский. От них можно избавиться и ничего в поведении программы не изменится.
<?
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
private $name;
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
private $name;
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russianHuman= new RussianHuman ('Иван');
echo $russianHuman->introduceYourself().'<br>';
$englishHuman= new EnglishHuman ('John');
echo $englishHuman->introduceYourself();
class RussianHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function __construct(string $name)
{
parent::__construct($name);
}
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$boris = new RussianHuman('Борис');
echo $boris->introduceYourself() . '<br>';
$micheal = new EnglishHuman('Michael');
echo $micheal->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$objectR = new RussianHuman('Павел');
$objectR->introduceYourself();
$objectE = new EnglishHuman('Scott');
$objectE->introduceYourself();
echo $objectR->introduceYourself();
echo $objectE->introduceYourself();
?>
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Ben');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$RussianHuman = new RussianHuman('Иван');
echo $RussianHuman -> introduceYourself();
echo '<br>';
$EnglishHuman = new EnglishHuman('Mike');
echo $EnglishHuman -> introduceYourself();
abstract class HumanAbstract
{
private $name;
public function __construct (string $name)
{
$this->name=$name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Добрый день';
}
public function getMyNameIs(): string
{
return 'Меня зовут ';
}
}
class EnlishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is ';
}
}
$russian=new RussianHuman('Мария');
$english=new EnlishHuman('Mary');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
Результат:
Добрый день! Меня зовут Мария.
Hello! My name is Mary.
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function name(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself()
{
echo $this->getGreetings().'! '.$this->getMyNameIs().' '.$this->name.'<br>';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My names is';
}
}
$russian = new RussianHuman('Сергей');
$english = new EnglishHuman('Bill');
$russian->introduceYourself();
$english->introduceYourself();
У меня вот такой вопрос: как видно из задания в методе introduceYourself я решил воспользоваться конструкцией echo и при тестировании кода получил ошибку: Fatal error: Uncaught TypeError: Return value of HumanAbstract::introduceYourself() must be of the type string, none returned in D:\OSPanel\domains\test2\public_html\index.php:262 Stack trace: #0 D:\OSPanel\domains\test2\public_html\index.php(294): HumanAbstract->introduceYourself() #1 {main} thrown in D:\OSPanel\domains\test2\public_html\index.php on line 262, НО объект RussianHuman отработал нормально Вопрос почему оба не сломались?
После этого я убрал контроль типа данных у этого метода и всё успешно отработало.
Потом также протестировал в этом методе return и вернул контроль типов. И вот вопрос: когда мы в методе делаем контроль возвращаемых данных echo нельзя использовать? Надеюсь что данёс суть вопроса. Спасибо.
Суть не в том, что вы echo использовали, а в том что написали что метод возвращает строку и не вернули её. Если бы написали return 'abc'; а перед ним написали бы echo, то всё бы работало.
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russianHuman = new RussianHuman('Александр Невский');
$englishHuman = new EnglishHuman('Peter Parker');
echo $russianHuman->introduceYourself();
echo '<br>';
echo $englishHuman->introduceYourself();
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут,';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$objectA = new RussianHuman('Иван');
echo $objectA->introduceYourself().'<br>';
$objectB = new EnglishHuman('Mike');
echo $objectB->introduceYourself();
Сделал, надеюсь правильно понял задание). Почему в Problems пишет, что метод introduceYourself() нигде не используется, хотя я его юзаю в выводе в цикле?
<?php
abstract class HumanAbstract
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
abstract public function getGreetings(): string;
abstract public function getMyNameIs(): string;
public function introduceYourself(): string
{
return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
}
}
class RussianHuman extends HumanAbstract
{
private $hi;
private $value;
public function __construct( string $name, string $hi , string $value)
{
parent::__construct( $name);
$this->hi = $hi;
$this->value = $value;
}
public function getGreetings(): string
{
return $this->hi;
}
public function getMyNameIs(): string
{
return $this->value;
}
}
class EnglishHuman extends HumanAbstract
{
private $hi;
private $value;
public function __construct( string $name, string $hi , string $value)
{
parent::__construct( $name);
$this->hi = $hi;
$this->value = $value;
}
public function getGreetings(): string
{
return $this->hi;
}
public function getMyNameIs(): string
{
return $this->value;
}
}
$humans = [
new EnglishHuman('Ivan', 'Hello', 'My name is'),
new RussianHuman('Иван', 'Привет', 'Меня зовут')
];
foreach ($humans as $human) {
echo $human->introduceYourself();
echo '<br>';
}
class RussianHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Привет';
}
public function getMyNameIs(): string
{
return 'Меня зовут';
}
}
class EnglishHuman extends HumanAbstract
{
public function getGreetings(): string
{
return 'Hello';
}
public function getMyNameIs(): string
{
return 'My name is';
}
}
$russian = new RussianHuman('Иван');
$english = new EnglishHuman('Noah');
echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();
Разобрался
Всё так, методы возвращают строки, нужно их просто вывести:
А так - всё отлично!
Да, спасибо, разобрался.
Хорошо.
Всё ок, только стоит echo добавить перед $rus->introduceYourself();
А где метод introduceYourself?
Отлично
Отлично!!!
Супер гуд!
Спасибо!
Хорошо, но комментарии TODO нужно убрать. Они создаются для того, чтобы не забыть что-то сделать.
Домашка:)
Отлично =)
Супер! =)
Отнаследуйте от него 2 класса: RussianHuman и EnglishHuman.
Реализуйте в них методы getGreetings(), которые будут возвращать приветствие на разных языках, вроде «Привет».
Реализуйте в них методы getMyNameIs(), которые будут возвращать на разных языках слова «Меня зовут».
В итоге метод introduceYourself должен возвращать строку, вроде «Привет! Меня зовут Иван.»
Создайте объекты этих классов и заставьте их поздороваться.
Отлично!
Супер! Быстро осваиваешь материал.
Готово)
Супер!
Отлично
Хорошо, но нужно добавить типы возвращаемых значений у методов. Почитайте о них в документации.
Отлично!
EnglishHuman
RussianHuman
index.php
Супер!
Отлично!
Привет! Спасибо за урок.
Вот что получилось:
Отлично!
Супер!
Отлично!
Ок, только тогда уж Dmitry =)
Комментарии ToDo можно убрать - вы же уже сделали, то что в них требуется.
Вообще правильно?
Конечно) Отлично!
Для чего в наследниках конструкторы?
Век живи, век учись. На автомате написал, задумался видимо....
Отлично!
Отлично!
Вроде разобрался...
Отлично
Домашка: 5 (Абстрактные классы)
Курс для начинающих проходили? Что за подчеркивания в именах переменных?
Должно быть
"Меня зовут " - пробел в конце. return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.'; - ещё один пробел после $this->getMyNameIs(). Итого на выходе в строке два пробела подряд, а нужен один. Нужно внутри getMyNameIs() убрать пробел в конце.
Должен быть пробел.
Пробелов быть не должно.
В остальном - отличная работа.
В дочернем классе не используется доступ к свойству. Значит private.
В аргументах должны передаваться строки, в кавычках. А у вас - константы, повезло, что имена без пробелов.
Понял,спасибо
Отлично
Супер!
Спасибо, ваше уроки очень полезные для меня.
Пожалуйста)
Отлично
Всё отлично, только отступы в абстрактном классе поехали.
Отлично!
Два восклицательных знака после приветствия. В большинстве языков он один. И отступы поехали в абстрактном классе.
Отредактировал абстрактный класс, сделав свойство name "protected", чтобы его можно было унаследовать дочерним классам и, помимо этого, использовать parent::__construct($name). Считается ли это правильным для абстрактных классов?
Чтобы использовать родительский контроллер вам не нужен прямой доступ к свойству name. Его следует оставить приватным
Наверное я что-то неправильно делаю, но если я сделаю свойство name "private", не изменяя другой код, то получу на выходе
Привет! Меня зовут
Hello! My name is
Потому что напрямую к private-свойству родительского класса доступа нет. Но вы можете достучаться до него через геттер родительского класса, который является публичным.
Отлично
Зачем один и тот же код в двух классах? Он должен быть написан в родительском классе и использоваться в дочерних. Посмотрите решения других учеников.
А где код класса Human?
$rus_human - имена переменных пишутся в camelCase, без всяких подчеркушек.
Код целиком.
Спасибо за замечания! В следующий раз буду писать имена переменных в camelCase
Отлично. Только ; не хватает после return.
Кстати да, :)
Все равно путаюсь в реализации, пока не особо понятно, но если код работает, значит все правильно идет.
Отлично
Отлично
string с маленькой буквы
Супер!
Что ещё за value? Имена должны отражать своё назначение.
Отлично!
Домашка:
Методы в обоих классах полностью одинаковые. Это значит что они у них общие и их можно вынести в родительский класс, откуда они его оба унаследуют. Но я вам всё же советую перечитать ДЗ, так как это несколько отличается от того, что было нужно сделать.
Надеюсь всё правильно понял
Всё верно поняли. Отлично)
Домашка:
Отлично
Отлично
Отлично
Отлично
Домашка
Отлично
Супер!
Всё шикарно заходит, спасибо
Отлично
Отлично
Норм. А слабо сделать свойство name private?
С трейтом дичь какая-то, почему не сделали как с getGreetings()?
Разве trait не используется для добавления функционала классам.
Из этих мыслей добавил trait.
Да, но только когда код требуется в нескольких не связанных между собой классов. А у вас в трейте прямо происходит привязка к классам - если это класс один, то делай одно, если другой - другое.
спасибо за разъяснение , учту.
А как все таки правильно вызывать конструктор с параметрами родительского класса в дочернем конструкторе класса? если понял верно то параметры передаваемые в конструктор совпадают с родительским конструктором по кол-ву и типу можно не указывать parent. ?
В дочернем конструкторе, как и в любом другом методе, можно расширять конструктор, то есть добавлять новые параметры. Но остальные, которые совпадают по порядку с родительским, нельзя изменять.
При вызове parent::method вызывается родительский метод. Его можно вызывать, а можно и не вызывать. Но если его не вызвать, то код родительского конструктора попросту не выполнится.
Всё вышеописанное касается не только конструкторов, но и вообще любых методов. Потому что конструктор это такой же метод как и все остальные, просто вызывается автоматически при создании класса.
Супер!
Вот что получилось:
Отлично!
Homework:
Всё исправил...
Для чего в дочерних методах переопределили конструктор и метод introduceYourself?
$language - почему такое имя у переменной?
Отлично
Отлично
Отлично
Тип аргумента потеряли
Мой пример
Отлично
Отлично
Отлично. Только TODO-комменты уже можно убрать, вы ведь реализовали логику.
Отлично!
Отлично
Добрый вечер.
Честно говоря, назначение абстрактных классов я не понял. Т.е. в д.з. вместо абстрактного вполне можно было использовать и обычный, ничего бы не изменилось.
Отлично.
Здесь в абстрактном классе реализована лишь часть функционала, а в дочерних - другая. При этом в абстрактном используются обращения к еще не реализованным частям, которые могут быть по-разному реализованы в дочерних классах.
Далее в уроках когда дойдем до MVC будут более подходящие примеры.
Спасибо за помощь.
Отлично!
Для чего этот комментарий оставили?
Для чего эта прослойка?
Коммент шторм автоматом вывел.
Что значит - переслойка?
Исправил...
Прослойка - значит еще один слой кода, лежащий между двумя другими уровнями. Вместо того чтобы напрямую вызвать introduceYourself у HumanAbstract вы определили методы у дочерних классов, которые только и делают, что вызывают родительский. От них можно избавиться и ничего в поведении программы не изменится.
А что с отступами в первом классе?
Исправил, спасибо.
Отлично
Отлично. Только закрывающй тег в конце файла не нужен.
Нуу, эмммм, как-то так, я считаю, так будет лучше, удобнее вводить входные параметры)))))
У вас получилось дублирование кода. Только имена переменных отличаются.
Отлично
Добрый день!
Отлично!
Результат:
Добрый день! Меня зовут Мария.
Hello! My name is Mary.
Отлично
Отлично
У меня вот такой вопрос: как видно из задания в методе introduceYourself я решил воспользоваться конструкцией echo и при тестировании кода получил ошибку: Fatal error: Uncaught TypeError: Return value of HumanAbstract::introduceYourself() must be of the type string, none returned in D:\OSPanel\domains\test2\public_html\index.php:262 Stack trace: #0 D:\OSPanel\domains\test2\public_html\index.php(294): HumanAbstract->introduceYourself() #1 {main} thrown in D:\OSPanel\domains\test2\public_html\index.php on line 262, НО объект RussianHuman отработал нормально Вопрос почему оба не сломались?
После этого я убрал контроль типа данных у этого метода и всё успешно отработало.
Потом также протестировал в этом методе return и вернул контроль типов. И вот вопрос: когда мы в методе делаем контроль возвращаемых данных echo нельзя использовать? Надеюсь что данёс суть вопроса. Спасибо.
Суть не в том, что вы echo использовали, а в том что написали что метод возвращает строку и не вернули её. Если бы написали return 'abc'; а перед ним написали бы echo, то всё бы работало.
Супер
Отлично
Сделал, надеюсь правильно понял задание). Почему в Problems пишет, что метод introduceYourself() нигде не используется, хотя я его юзаю в выводе в цикле?
Видимо глючит IDE.
Всё отлично, но проблема с форматированием. Сделайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Такой вопрос почему методы влияют на переменные вне метода?
На какие переменные? На свойства класса?
Вот это нужно поубирать