вызов и вывод метода с свойством echo в ООП

112
04 июля 2021, 12:40

Есть такая конструкция кода

abstract class Main
{
    protected $name = 'Main';
    public function callMe()
    {
        return $this->foo();
    }
    public function foo()
    {
        throw new Exception('Foo Not Found');
    }
    protected function getName()
    {   
        return $this->name;
    }
}
class One extends Main
{
    public function foo()
    {
        $name = $this->getName();
        echo "Hello from class ".$name."\n";
    }
    public function getName()
    {
        echo "Two";
    }
}

Создаю объект, и вызываю метод callMe()

 $one = new One();
 $one->callMe();

Но выводит она мне

TwoHello from class 

а не

Hello from class Two

c return работает все норм,

public function getName()
{
    return "Two";
}

но почему echo выводит two до выражения? если оно должно как бы присваиваться переменной?

Answer 1

echo выводит строку. Это совсем не одно и то же, что возвращает строку. На самом деле echo знает о некотором месте, в которое надо направлять вывод (обычно это стандартный поток вывода). Фактически echo ведёт себя как процедура, она изменяет внешнее состояние и ничего не возвращает. Для вашего примера это означает, что сразу после вызова echo в стандартный вывод попадёт Two и только потом будет вызвана следующая echo и она добавит в стандартный вывод Hello from class. Отсюда TwoHello from class.

Учитывая всё вышесказанное, при разработке своих программ следует избегать вызовов echo. И сокраить работу с вводом до единственного echo.

class One extends Main
{
    public function foo()
    {
        $name = $this->getName();
        return "Hello from class ".$name."\n";
    }
    public function getName()
    {
        return "Two";
    }
}
$one = new One();
echo $one->callMe();

Вызывая echo в недрах своей программы вы ничего не знаете о состоянии вывода на данный момент, и как видно из вашего примера, даже всего два echo могут вызвать путаницу.

READ ALSO
не отправляется форма через ajax

не отправляется форма через ajax

При клике на кнопку,всплывает модалька бутстрапа с формой, после отправки формы появляется модалька "Спасибо, бла бла"без ajax форма работает,...

99
Не записывает данные в БД

Не записывает данные в БД

Собственно, пришёл с таким вопросом, почему не проходят данные в БД? Как ни пробовал, убирал одинарные кавычки, обычные, ставил даже там где...

89
RedbeanPHP, sql

RedbeanPHP, sql

Подскажите пожалуйста, как правильно найти и вывести данные из бд, чтобы сообщения выводились построчно и последовательно, только мне и только...

90
Большой запрос в MySQL (php)

Большой запрос в MySQL (php)

Есть группа в ВКонтакте, я получаю список всех участников группы и записываю их идентификаторы в базу данных

71