Наследование и модификаторы доступа

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Adelf, ничего не имею против твоего подхода к обучению.
Однако, твой пример считаю некорректным. Пользоватся машиной или сайтом можно без знаний, а чтобы обслуживать сайт или машину - знания нужны.
Я не поеду на ТО к мастеру, который тупо выполняет инструкцию, не понимая как работает двигатель.

Обрати внимание, что сейчас ты нарушаешь правила форума: флеймишь, офтопишь, и обращаешься ко мне лично ;)
 

Adelf

Administrator
Команда форума
А какой смысл в функции bar? Зачем она обращается к приватному свойству не своего класса?
PHP:
$aa2->bar($a); // даст вполне заслуженную ошибку
Да... нарушаю. Можем перенести куда-нибудь. Хотя ты своим примером вернул в нужное русло.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А какой смысл в функции bar? Зачем она обращается к приватному свойству не своего класса?
PHP:
$aa2->bar($a); // даст вполне заслуженную ошибку
код в моем примере полностью рабочий, корректный и используется в ядре популярных фреймворков
gri@ubuntu:/www$ php test.php
112
p.s. не сразу понял вопрос
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
в том и дело, что оба метода обращаются к полям _своего_ класса, но эти поля - разные
 

Adelf

Administrator
Команда форума
почему на вполне законный вызов $aa2->bar($a); оно дает ошибку?

в том и дело, что оба метода обращаются к полям _своего_ класса, но эти поля - разные
Ничего подобного. В коде напрямую идет обращение к полю x класса А из класса Аа. Да, тут реализация PHP дает в некоторых случаях что-то выдавать, но это не повод писать такой ужасный код.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
есть и другой вариант: реальность отличается от твоей фантазии о том, как тебе бы хотелось, чтобы работало ООП,
но работает оно вот именно так

>почему на вполне законный вызов $aa2->bar($a); оно дает ошибку?
потому что у метода, который определен в классе Аа, нет доступа к приватным полям объектов, созданных из других классов,
в объекте $a нет полей, определенных в классе Аа

раздели понятия класса и объекта - это разные сущности
 
Последнее редактирование:

Adelf

Administrator
Команда форума
Пока я вижу лишь то, что говнокод сыпется стоит лишь сделать шаг вправо или влево.
bar должна принимать в качестве параметра свой класс.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я бы назвал говнокодом все примеры из мануала, потому что мануал призван демонстрировать принципы работы языка, а примеры правильного кода называются best practices
я умышленно указал неуместный тип параметра, в рабочем коде должно быть function bar (Aa $a),

эта техника используется для реализации примесей, подключения поведений, передачи структуры схемы таблицы БД между моделями Active Record,

как-раз из-за этого я 2 года назад напал на автора Yii, когда отловил бесконечную рекурсию :)
что, я надеюсь, заставило его быстро выпустить yii2 уже с нормальной архитектурой,
но отдебажить я мог только зная как работает ООП
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
щас еще придет фиксер и заставит чувствовать себя ламером, и долго думать )))
 

Adelf

Administrator
Команда форума
я правда не понял что твой пример поменял. Моя фраза была - private свойства класса доступны только из этого класса.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, но вопрос был про связь доступа с наследованием, а ты ответил "тишина должна быть в библиотеке",
и прости, но я не готов к рекурсивному обсуждению педагогики
 

Тугай

Новичок
Код:
class A{
private $x=1;
private $y=1;
public function foo(){ $b = new B; return $b->x . $b->getX();}
public function bar(){ $b = new B; return $b->y . $b->getY();}
}

class B extends A{
private $x = 2;
public $y = 2;
public function getX() {return $this->x;}
public function getY() {return $this->y;}
}

$a = new A;
echo $a->foo(); // 12
echo $a->bar(); // 12
Кино, при переопределении private свойств, память распределятся столько раз сколько переопределений, доступ определятся контекстом класса. :)
 

fixxxer

К.О.
Партнер клуба
доступ определятся контекстом класса
Тугай познаёт мир. :)

Щас вот кстати объясню, почему так, одним простым примером:

PHP:
class Foo {
    private $x;
    public static function construct() {
        $self = new self();
        $self->x = 1;
        return $self;
    }
    private function __construct() {}
    public function getX() { return $this->x; }
}
echo Foo::construct()->getX();
Хотя не, лучше двумя:
PHP:
    public static function createCloneOf(Foo $foo) {
        $self = new self();
        $self->x = $foo->x;
        return $self;
    }
UPD: лучше тремя!

PHP:
    public function equalsTo(Foo $foo) {
        return $this->x === $foo->x;
    }
 
Последнее редактирование:
Сверху