static:: не аналог $this-> для статических классов?

Redjik

Джедай-мастер
Да, и public и protected нормально наследуются в детей, не наследуется только private, чем и отличается от protected.
Да это то понятно, просто не логично, что
PHP:
$b->foo();  // работает нормально, т.к. метод принадлежит к классу А, выводит 1!!!
при этом если $var поменять на protected, то $b->foo(); будет давать уже 2.

я это еще потестирую, ибо все же лучше самому удостовериться =)))
 

Redjik

Джедай-мастер
потому что я считаю не логичным такое поведение
PHP:
class A
{
    private $var = 1;

    public function foo()
    {
        echo($this->var);
    }
}

class B extends A
{
}

$b = new B();
$b->foo(); // работает как ожидалось, выводит 1
B наследует публичный метод, все хорошо, для него не существует $var.
Следовательно при запуске метода foo, идет обращение к необьявленной переменной для этого класса. -> warning

Ибо если везде написано, что private не наследуется, то логика protected и public все равно должны сохраянться, по моему мнению они должны работать идентично,
так как в моем понимании private === final private
никогда не любил private свойства и методы, завтра засяду тестировать
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
class A {
    private $var = 1;
    public function foo() {
		echo __CLASS__ . PHP_EOL;
        echo $this->var. PHP_EOL;
    }
}

class B extends A {
	private $var = 2;
	public function nice() {
		echo __CLASS__ . PHP_EOL;
		echo $this->var. PHP_EOL;
	}
}

$b = new B();
$b->foo();  // output: A 1
$b->nice(); // output: B 2
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Область объявления метода в данном случае никак не связана с областью видимости свойства.
PHP:
<?php
class A {
    private $var = 1;
    public function foo() {
		echo __CLASS__ . PHP_EOL;
        echo $this->var. PHP_EOL;
    }
}

class B extends A {
	private $var = 2;
	public function foo()
	{
		echo __CLASS__ . PHP_EOL;
        echo $this->var. PHP_EOL;
	}
	public function nice() {
		echo __CLASS__ . PHP_EOL;
		echo $this->var. PHP_EOL;
	}
}

$b = new B();
$b->foo();  // output: B 2
$b->nice(); // output: B 2
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ключевое тут в понимании наследования это то, что «когда вы расширяете класс, дочерний класс наследует все публичные и защищенные методы из родительского класса. До тех пор пока не будут эти методы переопределены, они будут сохранять свою исходную функциональность.» — http://www.php.net/manual/ru/language.oop5.inheritance.php

Твое понимание ломает правильное наследование.
 

Redjik

Джедай-мастер
видно я и правда не совсем правильно понимал механизм наследования, сейчас оттестил твои примеры.
спасибо!

вдолбил в голову "исходную функциональность" и с приватными свойствами все встало на свои места, раз их нельзя переопределить, то они сохраняют исходную функциональность... по сути опять же final
 

Redjik

Джедай-мастер
флоппик
[off]а по поводу блога - я думал ссылка с софтиной для хуавея (топик был про рассылку смс) - это и есть твой блог =)))
в любом случае, ждем-ждем =)))
кстати натолкнуло на мысль для топика в offtop
[/off]
 

scorpion-ds

Новичок
scorpion-ds
так - что тебе конкретно непонятно?
не бывает статических классов - бывают статические свойства и методы
Мне все понятно, просто мне пытались недавно доказать, что бывают именно статические классы, мои доводы, что это просто классы со статическими методами и свойствами игнорировались. Ссылались на C#, вроде и в PHP должно быть также, я так тогда и не глянул, что с этим в C#, а сегодня увидел эту тему о "статических классах" и вспомнил тот разговор.
 

scorpion-ds

Новичок
вдолбил в голову "исходную функциональность" и с приватными свойствами все встало на свои места, раз их нельзя переопределить, то они сохраняют исходную функциональность... по сути опять же final
Ничего они не final, приватные переменный доступны только в рамках родного класса, но в наследниках их можно переопределить (правда наследники и не знаю о том, что они существуют в родительском классе), final переопределить нельзя.
 

AmdY

Пью пиво
Команда форума
Иван Redjik Матвеев
там всё ещё более кучеряво и есть понятие контекста, вот пример как вызвать протектид свойство объекта, если это делается в контексте его наследника
PHP:
class A
{
    protected $var = 1;
}

class B extends A
{
	public function foo($A)
    {
        echo($A->var);
    }
}

$b = new B();
$b->foo(new A());
но это говнокод и так писать нельзя и тратить время на заморочки не следует.
 

fixxxer

К.О.
Партнер клуба
Не всегда это говнокод, есть примеры уместного использования, типа так вот:

PHP:
class User {

    public static function constructById($id) {
        $self = new static;
        $self->load(compact('id'));
        return $self->isLoaded() ? $self : null;
    }

    protected function load($args) ....

}
Тут правда неясно зачем load protected. Но, в общем, можно придумать, когда это имеет смысл :) В общем, для эмуляции перегрузки конструкторов я такой подход использовал часто, не вижу никакого в этом говнокода.
 

Redjik

Джедай-мастер
Иван Redjik Матвеев
там всё ещё более кучеряво и есть понятие контекста, вот пример как вызвать протектид свойство объекта, если это делается в контексте его наследника
PHP:
class A
{
    protected $var = 1;
}

class B extends A
{
	public function foo($A)
    {
        echo($A->var);
    }
}

$b = new B();
$b->foo(new A());
но это говнокод и так писать нельзя и тратить время на заморочки не следует.
для такого придумали фабрику :D
 

AmdY

Пью пиво
Команда форума
Иван Redjik Матвеев
если мы про одну и туже фабрику, то она для другого.

fixxxer
я такой способ только для тестирования legacy code юзаю.ИМХО, здесь нарушение инкапсуляции, если я сделал протектид метод, значит он не должен был вызываться извне. Хотя, да, это скорее путь к потенциальному говнокоду, но если аккуратно, то где-то можно сэкономить на копипасте и излишнем наследовании.
 
Сверху