Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
<?php
class Cat
{
private $name;
private $color;
public $weight;
public function __construct (string $name, string $color) /*теперь при создании нового кота
мы должны указать имя и цвет*/
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Дратути, меня зовут ' . $this->name . ', моя шерстка цвета ' . $this->color . '<br>';
} /* дополнение к методу приветствия */
public function setName(string $name)
{
$this-> name = $name;
}
public function setColor(string $color) //метод для присвоения цвета шерсти кота
{
$this-> color = $color;
}
public function getName():string
{
return $this->name;
}
public function getColor():string // получаем значения цвета шерсти
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1-> sayHello(); //Дратути, меня зовут Снег, моя шерстка цвета белый
$cat1-> setName('Снег');
$cat1->setColor('серый');
$cat2 = new Cat ('Барсик', 'рыжий');
$cat2->sayHello(); //Дратути, меня зовут Барсик, моя шерстка цвета рыжий
$cat1->sayHello(); //Дратути, меня зовут Снег, моя шерстка цвета серый
<?php
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color){
$this->name = $name;
$this->color = $color;
}
public function sayHello() {
echo "Привет, меня зовут {$this->name}, мой цвет - $this->color.";
}
public function getColor(): string {
return $this->color;
}
public function setColor(string $color) {
$this->color = $color;
}
}
$cat1 = new Cat('Барсик','рыжий');
// $cat1 -> name = 'Барсик';
// $cat1 -> color = 'рыжий';
echo '<br>';
echo $cat1->sayHello();
$cat2 = new Cat('Снежок','белый');
// $cat1 -> name = 'Снежок';
// $cat1 -> color = 'белый';
echo '<br>';
echo $cat2->sayHello();
echo '<br>';
$cat1->setColor('черный');
echo $cat1->getColor();
и еще ругается на public function getColor(): string
Parse error: syntax error, unexpected ':', expecting ';' or '{' in codetester_source.php on line 14
а другой сервер не ругается. Почему?
Вы тут вызываете echo, и внутри метода вызываете echo. Либо в методе возвращайте строку через return, либо тут не нужно делать echo, и оставить его только внутри метода.
Странно, я тоже подумал версия старая, но проверил - 7.2
Вобщем не понятно, ну да ладно.. Про echo понял, действительно. Видимо не серьезная ошибка, интерпритатор не ругается.
Артем, а на ООП мало кто домашку в ответах выкладывает?
<?php
Class Cat{
private $name;
private $color;
public $weight;
public function __construct($name, $color){
$this->name = $name;
$this->color = $color;
return $this;
}
public function setName($name){
$this->name = $name;
}
public function getName($name){
$this->name = $name;
return $this->name;
}
public function getColor($color){
$this->color = $color;
return $this->color;
}
public function sayHello(){
echo "Привет! Меня зовут ".$this->name." и мой цвет ".$this->color." и мой вес ".$this->weight."<br>";
}
}
$cat1 = new Cat("Снежок", "белый");
$cat1->weight = "3 кг";
$cat2 = new Cat("Барсик", "рыжый");
$cat2->weight = "3,5 кг";
echo $cat1->sayHello();
echo $cat2->sayHello();
?>
class Cat
{
public function __construct(string $name, $color, float $weight)
{
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
private $name;
private $color;
private $weight;
public function sayHello()
{
echo 'Дароу! My name is ' . $this->name . ', i have ' .
$this->color . ' color and i weight ' . $this->weight . ' kilograms.','<br>';
}
public function setName(string $name)
{
$this->name = $name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function setWeight(float $weight)
{
$this->weight = $weight;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}public function getWeight(): float
{
return $this->weight;
}
}
$cat1 = new Cat('Тупой и пакостный ИШАК', 'white', "5.3");
$cat1->sayHello();
все таки не совсем врубаюсь зачем мы прописывали сеттеры и геттеры, если все параметры задаются через конструктор, и для чего их можно использовать
пойду дальше по курсу, мб позже до меня дойдёт)
Для того чтобы потом в дальнейшем через эти методы получать и задавать новые значения. Сеттеры как правило содержат в себе всяческие обработчики и валидаторы для новых значений, что бы не Бог весь что туда не засунулось - как-то так вроде. В геттерах тоже данные наверно как-то обрабатывать можно в зависимости от заданных аргументов геттеру.
Потому что название конструктора начинается с двух подчеркиваний. Замечания:
Слишком много очевидных комментариев.
Коммент "передаем в обьект нужные нам параметры" не имеет никакого отношения к коду, над которым он написан
Коммент "пердаем в параметр обьектов строку с свойствами" вообще бессмысленный - у объектов есть свойства, в которые можно что-то присвоить. У них нет никаких параметров.
Коммент "получаем напрямую свойства приватного обьекта" - не бывает никаких приватных объектов! Где вы взяли эти формулировки?
Конструкции вида $x->y не должны иметь никаких пробелов!
Хорошо, только значения по-умолчанию в классе не имеют смысла - они переопределяются сразу при создании объекта в конструкторе. У аргументов конструктора должны быть типы.
Хорошо. Для функций, которые ничего не возвращают стоит указывать return-type void. Открывающая скобка тела функции переносится на следующую строку (смотрите комментарий выше).
Очень похоже на ООП из С++, помню в университете проходили целый семестр классы, были некоторые вопросы не понятны, сейчас вроде стало намного понятнее с геттерами и сеттерами.
<?php
class Cat // создание класса кот
{
private $name;
private $color;
public $weight;
//конструктур принято объявлять в начале класса
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHi()
{
echo 'Привет! Меня зовут ' . $this->name . ', ' .'моя шерсть цвета: '. $this->color . '.' . '<br>';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1->setName('Снежок'); //можем изменить значение
$cat1->setColor('Черный'); //можем изменить значение
$cat1->sayHi();
$cat2 = new Cat('Барсик', 'Рыжий');
$cat2->setName('Котяра'); //можем изменить значение
$cat2->setColor('Белый'); //можем изменить значение
$cat2->sayHi();
?>
Дополните метод sayHello(), чтобы котики после того, как назвали своё имя, говорили о том, какого они цвета.
Сделайте свойство color приватным и добавьте в конструктор ещё один аргумент, через который при создании котика будет задаваться его цвет.
Сделайте геттер, который будет позволять получить свойство color.
Подумайте, стоит ли давать возможность менять котикам цвета после их создания? Если вам хватило совести сказать да - добавьте ещё и сеттер для этого свойства. Это вам в наказание - хорошие люди котов не перекрашивают.
Создайте теперь белого Снежка и рыжего Барсика и попросите их рассказать о себе.
<?php
class Cat
{
private $name;
private $color;
private $weight;
public function __construct(string $name, string $color, string $weight)
{
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function sayHello()
{
echo 'Привет! Меня зовут, ' . $this->name . '.<br>';
echo 'У меня цвет ' . $this->color . '.<br>';
echo 'Я вешу ' . $this->weight . '.<br>';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
public function setWeight(float $weight)
{
$this->weight = $weight;
}
public function getWeight(): float
{
return $this->weight;
}
}
$cat = new Cat('Снежок', 'white', 3.5);
$cat->sayHello();
$cat2 = new Cat('Барсик', 'red', 6.2);
$cat2->sayHello();
<?php
class Cat {
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color) {
$this -> name = $name;
$this -> color = $color;
}
public function sayHello() {
if ((substr($this -> color, -4, 2)) == 'ы') {
$i = 'ого';
} elseif ((substr($this -> color, -4, 2)) == 'и') {
$i = 'его';
}
echo 'Привет! Меня зовут ' . $this -> name . '! И я ' . substr($this -> color, 0, -4) . $i . ' цвета.';
}
public function setName(string $name) {
$this -> name = $name;
}
public function getName(): string {
return $this -> name;
}
public function setColor(string $color) {
$this -> color = $color;
}
public function getColor(): string {
return $this -> color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat2 = new Cat('Барсик', 'рыжий');
$cat1 -> sayHello(); // Привет! Меня зовут Снежок! И я белого цвета.
echo '<br>';
$cat2 -> sayHello(); // Привет! Меня зовут Барсик! И я рыжего цвета.
?>
Всё отлично. Для методов, которые ничего не возвращают лучше указывать тип :void. Для форматирования кода используйте самую первую кнопку в редакторе комментария.
<?php
class Cat {
private $name;
private $color;
private $age;
public function __construct(string $name, string $color, string $age = '11.12.18')
{
$this->name = $name;
$this->color = $color;
$this->age = $age;
}
public function setName(string $name):void
{
$this->name = $name;
}
public function setColor(string $name):void
{
$this->color = $color;
}
public function getName():string
{
return $this->name;
}
public function getColor():string
{
return $this->color;
}
public function getAge():string
{
return $this->age;
}
public function sayHello():void
{
echo '<p>Мяу! Меня зовут - '.$this->name.'. Мой окрас - '.$this->color.'. Я родился - '.$this->age.'</p>';
}
}
$cat1 = new Cat('Барсик','рыжий',date("d.m.Y"));
$cat1->sayHello();
$cat2 = new Cat('Cнежок','белый', date("d.M.y", mktime(0, 0, 0, 12, 10, 2018)));
$cat2->sayHello();
Решил вместо массы использовать дату рождения. У меня пара вопросов возникла после прочтения замечаний выше:
Правильно ли я использовал :void?
Нужен ли :void для конструктора?
У меня не получилось записать дефолтное значение аргументу конструктора $age = date("d.m.Y"). Это потому что я не так делаю или так априори синтаксис не позволяет?
Дополните метод sayHello(), чтобы котики после того, как назвали своё имя, говорили о том, какого они цвета.
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . '.' . ' Мой цвет ' . $this->color . '.';
}
Сделайте свойство color приватным и добавьте в конструктор ещё один аргумент, через который при создании котика будет задаваться его цвет.
private $name
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
Сделайте геттер, который будет позволять получить свойство color.
public function getColor(): string
{
return $this->color;
}
Подумайте, стоит ли давать возможность менять котикам цвета после их создания? Если вам хватило совести сказать да - добавьте ещё и сеттер для этого свойства. Это вам в наказание - хорошие люди котов не перекрашивают.
p.s коты стареют и выцветают :D
private $color;
public function setColor(string $color)
{
$this->color = $color;
}
Создайте теперь белого Снежка и рыжего Барсика и попросите их рассказать о себе.
$catSnejok = new Cat('Снежок', 'белый');
$catBarsik = new Cat ('Барсик', 'рыжий');
$catSnejok->sayHello();
$catBarsik->sayHello();
Имена классов начинаются с большой буквы. Что такое 2 в названии класса? Вообще ни о чем не говорит. Потом появятся lesson3 и lesson4? Название класса должно отражать его суть. Для чего свойство weight, если оно не используется? Почему оно public?
Если вы не хотите, чтобы свойство было доступно извне - то точно не public. Если хотите, чтобы к нему можно было обращаться в объектах дочерних классов - protected. Во всех остальных случаях используйте по умолчанию private.
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . '.<br>' ;
}
public function getColor(): string
{
return $this->color;
}
public function setColor(string $color)
{
$this->color = $color;
}
$cat1 = new Cat('белого');
$cat1->name = 'Снежок';
$cat1->weight = 3.5;
$cat1->setColor('за то, что насцал в ботинки перекрашен в ЗЕЛЕНЫЙ!');
$cat1->sayHello();
echo $cat1->getColor(). "<br>";
Вопрос - почему ошибка с echo $cat1->setColor(). "<br>"; ??
Правильно ли я понимаю что если имеется сеттер для этого же свойства, то он всегда перезаписывает геттер?
<?php
class Cat
{
public $name;
private $color;
public $weight;
public function __construct(string $color)
{
$this->color = $color;
}
public function sayHello()
{
echo "Привет! Меня зовут " . $this->name . ", я вешу " . $this->weight. " кг. Моя шерсть ". $this->color. " цвета!<br>" ;
}
public function getColor(): string
{
return $this->color;
}
public function setColor(string $color)
{
$this->color = $color;
}
}
$cat1 = new Cat('белого');
$cat1->name = 'Снежок';
$cat1->weight = 3.5;
$cat1->setColor('за то, что насцал в ботинки, ЗЕЛЕНОГО');
$cat2 = new Cat('рыжего');
$cat2->name = 'Барсик';
$cat2->weight = 6.2;
$cat2->sayHello();
$cat1->sayHello();
<?php
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello(): void
{
echo 'Привет! Меня зовут ' . $this->name . '. Я – ' . $this->color . ' котик!<br>';
}
public function setName(string $name): void
{
$this->name = $name;
}
public function setColor(string $color): void //Этот сеттер для нехороших людей :)
{
$this->color = $color;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$catSnegok = new Cat('Снежок', 'белый');
$catBarsik = new Cat('Барсик', 'рыжий');
$catSnegok->sayHello(); //Привет! Меня зовут Снежок. Я – белый котик!
$catBarsik->sayHello(); //Привет! Меня зовут Барсик. Я – рыжий котик!
<?php
class Cat
{
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Hi! My name is ' . $this->name . ', I am ' . $this->color .'.'. '<br>';
}
public function setName(string $name)
{
$this->name = $name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
public function getName(): string
{
return $this->name;
}
}
$barsik = new Cat('Barsik', 'red');
$barsik->sayHello();
$marsik = new Cat('Marsik', 'blue');
$marsik->setColor('grey');
$marsik->sayHello();
class Cat
{
private $name;
public $color;
public function __construct(string $name)
{
$this->name = $name;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ', мой цвет ' . $this->color;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
}
$cat1 = new Cat('Снежок');
$cat1->color = 'белый';
echo $cat1->sayHello();
2.
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ', мой цвет ' . $this->color;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor() : string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'Белый');
echo $cat1->sayHello();
3.
public function getColor() : string
{
return $this->color;
}
4.
НЕТ!
5.
class Cat
{
private $name;
private $color;
private $weight;
public function __construct(string $name, string $color, string $weight)
{
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ' мой цвет ' . $this->color . ' я вешу' . $this->weight . ' кг';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName() : string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor() : string
{
return $this->color;
}
public function setWeight(string $weight)
{
$this->weight = $weight;
}
public function getWeight() : string
{
return $this->weight;
}
}
$cat1 = new Cat('Снежок', 'Белый', ' 3.6');
$cat2 = new Cat('Барсик', 'Рыжий', ' 3.0');
$cat1->sayHello();
echo '<br>';
$cat2->sayHello();
В задании ничего не было связано с weight, к концу урока он тоже не изменился и был public, поэтому не трогал его. Ну, ладно, поправки сделал как у ребят, которые сделали задание правильно.
class Cat
{
private $name;
private $color;
private $weight;
public function __construct(string $name , string $color, float $weight)
{
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function sayHello()
{
echo 'Привет, меня зовут ' . $this-> name . '. ' . 'Цвет моей шерсти ' . $this->color . '.';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName():string {
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor():string {
return $this->color;
}
public function setWeight(){
$this->weight = $weight;
}
public function getWeight(): float{
return $this->weight;
}
}
$cat1 = new Cat('Снежок', 'белый', 3.9);
$cat1->sayHello();
$cat1->setColor('чёрный');// перекрашиваем 1-го котика
$cat2 = new Cat('Барсик' , 'рыжий', 2.9);
$cat2->setColor('серый');// перекрашиваем 2-го котика
$cat2->sayHello();
<?php
class Cat
{
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . '. Мой цвет '.$this->color.'.';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1->sayHello();
$cat2 = new Cat('Барсик', 'рыжий');
$cat2->sayHello();
В задании же нет прямого указания сделать все свойства приватными.
С другой стороны логичнее сделать приватным все таки это свойство.
Сделал приватным)
Вот сеттер и геттер
public function setWeight(string $weight)
{
$this->weight = $weight;
}
public function getWeight(): string
{
return $this->weight;
}
<?php
class Cat {
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo " Mew! \n My name is {$this->name}. \n My fur is {$this->color}. \n";
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Argo', 'orange');
$cat1->sayHello();
$cat2 = new Cat('Begemot', 'black');
$cat2->sayHello();
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Меня зовут ' . $this->name . ', цвет шерсти у меня ' . $this->color;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Тима', 'Белый');
$cat2 = new Cat('Барсик', 'Рыжий');
$cat1->sayHello();
echo '<br>';
$cat1->setName('Снежок');
$cat1->setColor('зеленый, не бывает таких котиков хозяин');
$cat1->sayHello();
echo '<br>';
$cat2->sayHello();
<?
class Cat {
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . '. Мой цвет - '.$this->color;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color=$color;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'Белый');
$cat1->sayHello();
$cat2 = new Cat('Барсик', 'Полосатый');
$cat2->sayHello();
?>
Зачем использовать гетеры сетеры, они ведь только добавляют лишние куски кода. Например гетеры, зачем получать значение с помощью функции, если проще обратиться на прямую?
Какая идет защита, если я обращаюсь к публичному методу, или к публичной переменной, ведь в итоге и там и там я получу одно значение?
В сеттере во-первых ограничивается тип задаваемого значения. То есть в свойство, в котором должно быть число, не запихнуть строку. Во-вторых, в сеттере могут быть другие валидации (например, число может быть в промежутке от 60 до 100), приведения (хранимое значение в БД будет отличаться от того, с которым удобнее работать в коде). В геттере тоже могут быть как привидения, так и реализация LazyLoad. Всё это будет в следующих уроках.
<?php
header('Content-Type: text/html; charset=utf-8');
class Cat{
private $name;
private $color;
public function __construct(string $name,$color){
$this->name=$name;
$this->color=$color;
}
public function sayHello(){
echo 'Hello, my name is '.$this->name.', i am '.$this->color.' color';
}
public function getColor():string {
return $this->color;
}
public function setColor($color){
return $this->color=$color;
}
}
$cat1= new Cat('Снежок','Белый');
$cat2= new Cat('Барсик','Рыжий');
$cat1->sayHello();
echo '</br>';
$cat2->sayHello();
Добрый день, я не все задания понял, но думаю, что большую часть выполнил в этом коде, не стал подглядывать как у других. Всё что здесь написано - плод моей не совсем здоровой фантазии.
<?php
class Cat
{
public $name;
public $color;
public $weight;
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name .' '. $this->color .'.'.'<br>';
}
}
$cat1 = new Cat();
$cat1->name = 'Снежок';
$cat1->color = 'белый';
$cat1->sayHello();
$cat2 = new Cat();
$cat2->name = 'Барсик';
$cat2->color = 'красный';
$cat2->sayHello();
class Cat2
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name .' '. $this->color .'.'.'<br>';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
}
$cat3 = new Cat2('Снежок', 'белый');
$cat3->sayHello();
$cat4 = new Cat2('Барсик', 'рыжий');
$cat4->sayHello();
?>
Отлично. Но только не надо было скидывать 2 класса, оставьте только последний вариант. Закрывающий тег ?> в конце файла ставить не нужно, прошу запомнить это!
<?php
class Cat
{
private $name;
private $color; //приватный цвет
//конструктор с цветом
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public $weight;
//Приветсвие с цветом
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ', мой цвет ' . $this->color . '.';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
//Геттер для цвета
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat2 = new Cat('Барсик', 'рыжий');
$cat1->sayHello();
echo '<br>';
$cat2->sayHello();
<?php
class Cat {
private $name;
private $color;
private $weigth;
public function __construct(string $name, string $color, float $weigth)
{
$this->name = $name;
$this->color = $color;
$this->weigth = $weigth;
}
public function sayHello()
{
echo 'Мяу!<br/>';
echo 'Привет, я '.$this->name.'.<br/>';
echo 'Я '.$this->color.'.<br/>';
echo 'Мой вес - '.$this->weigth.' кг.<br/>';
echo 'Мяу!<br/>';
}
public function getColor():string
{
return $this->color.'<br/>';
}
public function setColor(string $new_color):void
{
$this->color = $new_color;
}
public function getName():string
{
return $this->name.'<br/>';
}
}
$cat = new Cat('Барсик','рыжий',4);
$cat->sayHello();
$cat->setColor('серый');
$cat->getColor();
echo '<hr/>';
$cat1 = new Cat('Снежок','белый',3.1);
$cat1->sayHello();
Это конечный код моей программы. Сначала сделал сам, затем, просмотрев чужие работы и ваши комментарии к ним, исправлял ошибки в ней. Надеюсь, ошибок больше нема, а то уже заколебался носиться и исправлять ошибки.
Были моменты, когда другие в своих программах указывали тип возвращаемых функций, но я посчитал это лишним, ибо свойства объектов с самого начала имеют определённый тип данных, так что смысла в таком исправлении я не увидел. Иду дальше по урокам. Наставляйте меня дальше, мастер.
Выполнила задание, но с маленьким уточнением: создала один экземпляр класса и попрактиковала магические сеттеры и геттеры, чтобы изменить имя и цвет одному и тому же котику (хотя, конечно, можно было бы просто создать два объекта с требуемыми именами и не мучить виртуальных животных!) ))
<?php
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name=$name;
$this->color=$color;
}
public function sayHello()
{
echo 'Привет! Меня зовут '.$this->name .
' и мой цвет '. $this->color.'.';
}
public function setName(string $name)
{
$this->name=$name;
}
public function setColor(string $color)
{
$this->color=$color;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1 -> sayHello(); //Привет! Меня зовут Снежок и мой цвет белый.
var_dump($cat1);
$cat1 -> setName('Барсик');
$cat1 -> setColor('черный');
echo '<br> Результат getName() - '.$cat1->getName().' и getColor() - '.$cat1 -> getColor().'.<br>';
var_dump($cat1);
$cat1->sayHello(); //Привет! Меня зовут Барсик и мой цвет черный.
<?php
class Cat
{
private $name;
private $color; //Сделали свойство color приватным
public function __construct(string $name, string $color) //добавили color в конструктор
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ', ' . ' я ' . $this->color . '<br>';//после того, как назвали своё имя, говорят о том, какого они цвета
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string // Сделали геттер, который будет позволять получить свойство color
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'рыжий');
$cat1->sayHello();
$cat2 = new Cat('Барсик', 'серый');
$cat2->sayHello();
echo $cat1->getName();
echo '<br>';
echo $cat2->getColor();
3 class Cat
4 {
5 private $name;
6 public $color;
7 public $weight;
8
9 public function sayHello()
10 {
11 echo 'Привет! Меня зовут ' . $this->name . '.';
12 }
13
14 public function setName(string $name)
15 {
16 $this->name = $name;
17 }
18 }
19
20 $cat1 = new Cat();
21 $cat1->setName("Снежок");
22 $cat1→sayHello();
у меня не работает, пишет ошибку:
( ! ) Catchable fatal error: Argument 1 passed to Cat::setName() must be an instance of string, string given, called in /home/public_html/progi/cat.php on line 21 and defined in /home/public_html/progi/cat.php on line 14
В чем может быть проблема? Что означает данная ошибка?
ОС: Ubuntu 18.04
PHP: 5.6.37
Apache 2
Добр день,
Проблема решилась переходом на версию PHP 7.2
Но почему возникла такая ошибка на версии 5.6, так и не понял.
Я правильно поняла ,что через сеттер мы передаем значение, а через геттер мы его просто получаем(возвращаем), а через конструктор тоже передаем значение?
Очень нравятся курсы. Купил ООП и после прохождения куплю PHP для профессионалов. Насколько бы ты рекомендовал сайт с задачками codewars и вообще решение задач на таких сайтах?
<?php
class Cat
{
private $name;
private $color;
public $wight;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function SeyHello(){
echo 'Привет, меня зовут' . $this->name .',' . 'мой цвет - ' . $this->color .'.';
}
public function SetName(string $name){
$this->name = $name;
}
public function SetColor(string $color){
$this->color = $color;
}
public function GetName():string {
return $this->name;
}
public function GetColor():string {
return $this->color;
}
}
$cat1 = new Cat(' Roxy ', ' butyfull ');
$cat1 ->SeyHello();
<?php
class Cat
{
private $name;
private $color;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . '.';
echo '<br>У меня ' . $this->color . ' цвет шерстки.';
}
public function setName(string $name)
{
$this->name = $name;
}
public function setColor(string $color)
{
if (empty($this->getColor())) {
$this->color = $color;
}
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat2 = new Cat('Барсик', 'рыжий');
$cat1->sayHello();
$cat1->setName('Snag');
$cat1->setColor('white');//попытка изменить цвет не сработает, котикам не надо менять цвет :)
echo '<br>';
$cat1->sayHello();
echo '<br>';
$cat2->sayHello();
Почему вес public? Его нельзя вот так просто брать и изменять. Вес кота можно менять, к примеру, с помощью метода giveFood(), который будет чуть-чуть увеличивать вес. Но напрямую через свойство - нельзя. Для этого мы и делаем свойства private, чтобы внутреннее состояние объекта не менялось непредсказуемым образом. Работая с ним через публичные методы мы можем делать дополнительные проверки.
public function getName(): string
{
return $this->name;
}
Вопрос: почему в геттере Вы пишите вот так ": string", а у меня сработало без этого. Ведь мы же получаем а не передаём и в сеттере уже по идее установлен тип данных.
Это одно из нововведений новой версии php8, возможность указать несколько типов аргументов через |
Однако я не рекомендую так делать, так как это противоречит самому принципу типизации. Вес - величина с плавающей точкой, так что делайте float.
<?php
class Cat
{
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ' и мой цвет ' . $this->color . '. ';
}
public function setName(string $name)
{
$this->name = $name;
}
public function setColor(string $color)
{
$this->color= $color;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1 ->sayHello();
$cat2 = new Cat('Барсик', 'рыжий');
$cat2 ->sayHello();
<?php
class Cat
{
private $name;
private $color;
public $weight;
public function __construct(string $name, string $color)
{
$this->color =$color;
$this->name = $name;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name.', мой цвет '.$this->color.'.';
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat1->sayHello();
echo '<br>';
$cat2 = new Cat('Барсик', 'рыжий');
$cat2->sayHello();
Как-то так?) А можно было сеттеры и геттеры имени и цвета объединить в один геттер и один сеттер? Или лучше для каждого свойства объекта делать отдельный метод?
<?php
class Cat
{
private $name;
private $color;
public function __construct(string $name , string $color)
{
$this->name = $name;
$this->color = $color;
}
public function sayHello()
{
echo 'Привет! Меня зовут ' . $this->name . ',' . ' я ' . $this->color ;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
public function setColor(string $color)
{
$this->color = $color;
}
public function getColor(): string
{
return $this->color;
}
}
$cat1 = new Cat('Снежок', 'белый');
$cat2 = new Cat('Барсик', 'рыжий');
echo $cat1->sayHello() . '<br>';
echo $cat2->sayHello() . '<br>';
Домашка:
Отлично! Всё-таки перекрасили :D
и еще ругается на public function getColor(): string
Parse error: syntax error, unexpected ':', expecting ';' or '{' in codetester_source.php on line 14
а другой сервер не ругается. Почему?
Там где ругается - старая версия PHP.
Вы тут вызываете echo, и внутри метода вызываете echo. Либо в методе возвращайте строку через return, либо тут не нужно делать echo, и оставить его только внутри метода.
Странно, я тоже подумал версия старая, но проверил - 7.2
Вобщем не понятно, ну да ладно.. Про echo понял, действительно. Видимо не серьезная ошибка, интерпритатор не ругается.
Артем, а на ООП мало кто домашку в ответах выкладывает?
Да, пока мало кто выкладывает, только-только начали покупать вообще)
Домашка
Отлично
Случайно два сообщения написал) ДЗ:
1
2
3
4
5
6 Спасибо!
Отлично!
все таки не совсем врубаюсь зачем мы прописывали сеттеры и геттеры, если все параметры задаются через конструктор, и для чего их можно использовать
пойду дальше по курсу, мб позже до меня дойдёт)
Для того чтобы потом в дальнейшем через эти методы получать и задавать новые значения. Сеттеры как правило содержат в себе всяческие обработчики и валидаторы для новых значений, что бы не Бог весь что туда не засунулось - как-то так вроде. В геттерах тоже данные наверно как-то обрабатывать можно в зависимости от заданных аргументов геттеру.
Все верно =)
Супер! Только имена методов всегда с маленькой буквы.
Будет сделано Джеди-Мастер
Отлично!
поправил
Потому что название конструктора начинается с двух подчеркиваний. Замечания:
Конструктор котиков)
Хорошо, только значения по-умолчанию в классе не имеют смысла - они переопределяются сразу при создании объекта в конструкторе. У аргументов конструктора должны быть типы.
Спасибки. Подправил.
Отлично
Домашка:
Отличная домашка!
P.S. В PHP принято открывающую скобку тела функции переносить на следующую строку.
Хорошо. Для функций, которые ничего не возвращают стоит указывать return-type void. Открывающая скобка тела функции переносится на следующую строку (смотрите комментарий выше).
У которых после return ничего нет, либо у которых вообще отсутствует return =)
Очень похоже на ООП из С++, помню в университете проходили целый семестр классы, были некоторые вопросы не понятны, сейчас вроде стало намного понятнее с геттерами и сеттерами.
Хорошо, но public $weight; - лишнее.
Дополните метод sayHello(), чтобы котики после того, как назвали своё имя, говорили о том, какого они цвета.
Сделайте свойство color приватным и добавьте в конструктор ещё один аргумент, через который при создании котика будет задаваться его цвет.
Сделайте геттер, который будет позволять получить свойство color.
Подумайте, стоит ли давать возможность менять котикам цвета после их создания? Если вам хватило совести сказать да - добавьте ещё и сеттер для этого свойства. Это вам в наказание - хорошие люди котов не перекрашивают.
Создайте теперь белого Снежка и рыжего Барсика и попросите их рассказать о себе.
Отлично!
Хорошо.
Отлично! Прочитайте еще про mb_substr и про utf-8 в PHP тогда сразу)
Что-то не пойму, как сюда вставить скан кода))
Пока вставлю текстом:
Всё отлично. Для методов, которые ничего не возвращают лучше указывать тип :void. Для форматирования кода используйте самую первую кнопку в редакторе комментария.
Про void немного непонятно. В моём примере у каких методов надо его добавить?
setName или sayHello - методы, у которых после return ничего не указано, или вообще отсутствует return.
Решил вместо массы использовать дату рождения. У меня пара вопросов возникла после прочтения замечаний выше:
Привет, все отлично.
Трактор так трактор) Отлично!
Отлично!
P.S. Что-то где-то пропустил. По поводу указаний типов (string, void) данных. Это обязательно?
В каком уроке можно посмотреть примеры?
Привет. Обязательно. Урок про функции.
Дополните метод sayHello(), чтобы котики после того, как назвали своё имя, говорили о том, какого они цвета.
Сделайте свойство color приватным и добавьте в конструктор ещё один аргумент, через который при создании котика будет задаваться его цвет.
Сделайте геттер, который будет позволять получить свойство color.
Подумайте, стоит ли давать возможность менять котикам цвета после их создания? Если вам хватило совести сказать да - добавьте ещё и сеттер для этого свойства. Это вам в наказание - хорошие люди котов не перекрашивают.
Создайте теперь белого Снежка и рыжего Барсика и попросите их рассказать о себе.
Отлично! =)
Отлично!
Добрый день!
Домашнее задание:
Почему weight - public. И почему это строка, а не число?
Исправлено!)
getWeight() - почему без типа?
Пропустил...)
Отлично! Для сеттеров можно задать тип возвращаемого значения:
Отлично! Для методов, которые ничего не возвращают, можно писать тип void:
Имена классов начинаются с большой буквы. Что такое 2 в названии класса? Вообще ни о чем не говорит. Потом появятся lesson3 и lesson4? Название класса должно отражать его суть. Для чего свойство weight, если оно не используется? Почему оно public?
Подправил
Ок. Только назвать стоит Cat, так как этот класс является описанием одного экземпляра кота.
Отлично! Для методов, которые ничего не возвращают, можно писать тип void:
Хочу уточнить, речь идёт о методах, у которых отсутствует return? Например: setName
Да. Причем не просто return, а именно return "тут что-то есть"
Просто return без аргументов тоже вернёт null.
Ок, понятно!
Ок, но не надо сюда верстку вставлять. Об этом еще поговорим в следующих уроках.
Отлично
public $weight; - это для чего? Почему public?
Этот код я не использовал, но он может пригодиться одному из потомков)
Как определить какое свойство сделать приватным а какое публичным?
Если вы не хотите, чтобы свойство было доступно извне - то точно не public. Если хотите, чтобы к нему можно было обращаться в объектах дочерних классов - protected. Во всех остальных случаях используйте по умолчанию private.
Я смотрю до ООП дошли не все бойцы :))) комментов слало меньше ))
Итак домашка №1
№2
Свойства не должны быть паблик, должны задаваться через конструктор и сеттер.
№3
+
Ок
№4
Вопрос - почему ошибка с echo $cat1->setColor(). "<br>"; ??
Правильно ли я понимаю что если имеется сеттер для этого же свойства, то он всегда перезаписывает геттер?
Не понял вашего вопроса. Звучит, как будто не до конца разобрались в том, что происходит
№5
Отлично. Для сеттеров можно прописать тип возвращаемого значения :void
Супер!
Наконец-то вернулся к курсу!
Откуда public $weight;? Почему он public?
Тестировал различный код и нужен был третье свойство. Когда кидал домашку не удалил.)
Это полиция неиспользуемого кода. У вас неиспользуемое свойство. На первый раз отпускаем. Но будьте повнимательнее.
Отлично
Доброго времени суток. Наконец-то добрался до ООП
домашка
И вам доброго. Отлично!
1.
2.
3.
4.
НЕТ!
5.
Но сеттер для цвета всё же добавили)
// 1
Отлично!
Что это у вас weight наружу торчит? Почему public?
Почему weight у вас public? И почему его нет в конструкторе. Можно создать кота без веса. Это неправильно.
В задании ничего не было связано с weight, к концу урока он тоже не изменился и был public, поэтому не трогал его. Ну, ладно, поправки сделал как у ребят, которые сделали задание правильно.
Отлично
Тут не нужны пробелы
Супер! Только с отступами проблема. Используй Ctrl+Alt+L в phpstorm.
ДЗ
Красить кота не рискну)
public $weight; - это что? Почему public?
В задании же нет прямого указания сделать все свойства приватными.
С другой стороны логичнее сделать приватным все таки это свойство.
Сделал приватным)
Вот сеттер и геттер
Ничто не должно быть public, если это не используется вне объектов класса.
Кстати, в левой колонке сайта мне пишет предложение о покупке курсов за 1$.
Там кривовато час отображается
До окончания акции:
013:51:06
Спасибо
Ок. Но не надо заводить переменную с именем метода. Вызывайте сразу по имени напрямую.
Супер!
public $weight; - это что такое?
Методы, которые ничего не возвращают, можно описать как возвращающие :void
Спасибо, исправил
Супер!
Отлично
public $weight; - почему public?
я так и не понял, когда и какой модификатор ставить
Почитай в официальной документации, может там понятнее
public $weight; - это что? Почему public?
Почему свойство color а метод getColour?
Скобка, открывающая тело метода, переносится на следующую строку.
Понял, public $weight с задачек по курсу,нужно было не паблик,а протектед, имя метода невнимательно писал,всё понял,принял,исправлюсь.
Дело не в модификатора доступа, а в том, что свойство вообще не используется.
Сперва не понял про что. Теперь понял и исправил.
Окей. А почему через конструктор не задаешь?
Отлично
Домашка:
public $weight; - это что?
Здравствуйте, никто не указал ошибку или у всех срабатывает public function getName(): string ?
Выберите в OpenServer версию PHP >=7.1
При написании кода PHPStorm предложил мне автозаполнение при написании setName и getName и в комментариях перед методами написал для сеттера:
и для геттера:
Нужно ли это использовать?
И, собственно, сама дз:
Отлично. PhpDoc в случае, когда у вас прямо в коде указаны и типы аргументов, и тип возвращаемого значения, не нужен.
А чего это у вас weight public? Должно быть единообразно всё.
Зачем использовать гетеры сетеры, они ведь только добавляют лишние куски кода. Например гетеры, зачем получать значение с помощью функции, если проще обратиться на прямую?
Какая идет защита, если я обращаюсь к публичному методу, или к публичной переменной, ведь в итоге и там и там я получу одно значение?
В сеттере во-первых ограничивается тип задаваемого значения. То есть в свойство, в котором должно быть число, не запихнуть строку. Во-вторых, в сеттере могут быть другие валидации (например, число может быть в промежутке от 60 до 100), приведения (хранимое значение в БД будет отличаться от того, с которым удобнее работать в коде). В геттере тоже могут быть как привидения, так и реализация LazyLoad. Всё это будет в следующих уроках.
Отлично
Почему public?
Не понял вопрос ?
что должно быть там ? private ?
Вы должны самостоятельно ответить на этот вопрос после изучения темы модификаторов доступа. Для чего вы написали public?
чтобы в него не записали что-то другое. поэтому должен стоять модификатор доступа private с проверками если необходимо.
Правильно
Почему вместо числовых значений используете строки?
Отлично
Доброго времени суток!
это мое дз
Отлично!
Не нужно
{ - на новой строке
В целом все ок, но форматирование подводит. Используйте CTRL+ALT+L в PhpStorm
Добрый день, я не все задания понял, но думаю, что большую часть выполнил в этом коде, не стал подглядывать как у других. Всё что здесь написано - плод моей не совсем здоровой фантазии.
Отлично. Но только не надо было скидывать 2 класса, оставьте только последний вариант. Закрывающий тег ?> в конце файла ставить не нужно, прошу запомнить это!
И почему у кота можно вес менять минуя интерфейс? Почему все свойства private, а вес public?
Исправил вот так:
Либо в конструкторе добавить еще один аргумент - вес.
По-хорошему в конструкторе. И на комментарии можно отвечать
Понял.
А че вес строкой? Давай float! :)
Че это public?
Это про вес? В задании не надо было с ним ничего делать же.
Ну так тем более, что он тут забыл?)
Отлично. Комментарии слишком очевидные, толку от них нет, лучше не писать такое.
Ок, комменты для отсылки к пунктам домашки.
как-то так:
Отлично!
а что, так можно было?!
Почему это public?
Исправил+
Почему нет типов аргументов?
Строки пишутся в одинарных кавычках. И используйте конкатенацию строк и выражений:
Ну ёлки-палки, это же самые основы из курса для начинающих. Как можно в курсе ООП так писать? :)
Тоже тип аргумента не указали.
Это конечный код моей программы. Сначала сделал сам, затем, просмотрев чужие работы и ваши комментарии к ним, исправлял ошибки в ней. Надеюсь, ошибок больше нема, а то уже заколебался носиться и исправлять ошибки.
Были моменты, когда другие в своих программах указывали тип возвращаемых функций, но я посчитал это лишним, ибо свойства объектов с самого начала имеют определённый тип данных, так что смысла в таком исправлении я не увидел. Иду дальше по урокам. Наставляйте меня дальше, мастер.
Это что за пробелы? Их быть не должно.
В сеттере не стоит делать echo.
Чем больше типов указано, тем лучше. Советую указывать тип возвращаемого значения.
всё исправил. Спасибо :>
Не вижу исправлений
сорри, забыл сохранить изменения и закрыл вкладку. Теперь точно исправил:
убрал пробелы
указал тип возвращаемых данных
убрал echo из сеттера
Теперь отлично
Отлично
Почему public?
Просто никак не использовал, поэтому оставил паблик.
Если никак не используется, его нужно удалять, а не public делать
Почему public?
ПОдумала, что код менять не нужно, ошибку поняла, исправлю.
Отлично
Мой пример
Отлично!
Отлично!
Для чего? И почему public?
Для чего? И почему public? - осталось от прошлых манипуляций)
Теперь отлично
Прошу простить за форматирование кода, с планшета почему то не хочет править сообщение.
Если ipad, то не используйте safari
Спасибо, да все верно, именно такой вариант, попробую другой браузер.
Отлично
Выполнила задание, но с маленьким уточнением: создала один экземпляр класса и попрактиковала магические сеттеры и геттеры, чтобы изменить имя и цвет одному и тому же котику (хотя, конечно, можно было бы просто создать два объекта с требуемыми именами и не мучить виртуальных животных!) ))
Тут пробелы не нужны. В остальном - отлично!
Супер!
Всё-таки покрасили... Отлично)
Отлично
Котики имеют полное право на перекрашивание, если они сами хотят :)
Отлично)
Это для чего? Почему public?
Забыл почистить
Ок) А исправлять-то будете?)
Добрый день,
В теме «Модификаторы доступа» Ваш код:
у меня не работает, пишет ошибку:
( ! ) Catchable fatal error: Argument 1 passed to Cat::setName() must be an instance of string, string given, called in /home/public_html/progi/cat.php on line 21 and defined in /home/public_html/progi/cat.php on line 14
В чем может быть проблема? Что означает данная ошибка?
ОС: Ubuntu 18.04
PHP: 5.6.37
Apache 2
Добр день,
Проблема решилась переходом на версию PHP 7.2
Но почему возникла такая ошибка на версии 5.6, так и не понял.
Потому что скалярные типы появились только в 7.0. Весь курс рассчитан на PHP > 7.2
Я правильно поняла ,что через сеттер мы передаем значение, а через геттер мы его просто получаем(возвращаем), а через конструктор тоже передаем значение?
Да
Спасибо исправлюсь с отступами
Исправлю на private
А вы комментарий исправляйте тоже (карандашик слева вверху)
Почему public?
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Очень нравятся курсы. Купил ООП и после прохождения куплю PHP для профессионалов. Насколько бы ты рекомендовал сайт с задачками codewars и вообще решение задач на таких сайтах?
Крайне рекомендую, хорошо развивает алгоритмическое мышление. У нас на сайте тоже есть задачки.
Для чего это поле? Почему оно public?
Имена методов пишутся с маленькой буквы.
Скобка, открывающая тело метода, пишется на новой строке.
Вы курс для начинающих не проходили у нас?
Отлично
Добрый день! Спасибо за урок.
Отлично
Результат:
Привет! Меня зовут Снежок. Я белый. Очень люблю своего хозяина.
Привет! Меня зовут Барсик. Я рыжий. Очень люблю своего хозяина.
Почему вес public? Его нельзя вот так просто брать и изменять. Вес кота можно менять, к примеру, с помощью метода giveFood(), который будет чуть-чуть увеличивать вес. Но напрямую через свойство - нельзя. Для этого мы и делаем свойства private, чтобы внутреннее состояние объекта не менялось непредсказуемым образом. Работая с ним через публичные методы мы можем делать дополнительные проверки.
Спасибо, поправила!
Метод должен возвращать float
И в сеттер тоже число нужно передавать, аргумент ведь числовой
Спасибо, поправила!
Теперь отлично
Всё отлично. Только опечатка в слове weight
Вопрос: почему в геттере Вы пишите вот так ": string", а у меня сработало без этого. Ведь мы же получаем а не передаём и в сеттере уже по идее установлен тип данных.
Так указывается тип возвращаемого значения. Чтобы сразу было понятно что этот метод всегда возвращает строку.
Да и ещё вопрос я хотел передать в $wight и целое число и с плавующей точкой, через логический ||, но у меня не вышло. Возможно ли это?
Это одно из нововведений новой версии php8, возможность указать несколько типов аргументов через |
Однако я не рекомендую так делать, так как это противоречит самому принципу типизации. Вес - величина с плавающей точкой, так что делайте float.
это для чего?
Теперь всё иначе
Отлично
Это для чего?
Как-то так?) А можно было сеттеры и геттеры имени и цвета объединить в один геттер и один сеттер? Или лучше для каждого свойства объекта делать отдельный метод?
Как вы представляете себе объединенный геттер?
Интересная идея, что-то типа конструктора доступного после создания объекта получится)
Где тип для weight?
Лишний пробел
Почему weight передается строкой?
Исправлено.
Отлично