Уточнить по ООП в php 5.3

Dez

Новичок
Здравствуйте.
Кое какие вопросы хотелось бы уточнить (php 5.3.26):
1) В доках про свойства сказано что для строк heredoc нельзя, но следующее работает:
PHP:
class S1 {
  public $str =<<<EOT
b\n\nar
EOT;
}
$s = new S1;
print nl2br($s->str);
2)
В доках про конструкторы сказано:
Если в классе-потомке не определен конструктор, то он может наследоваться от родительского класса как обычный метод (если он не определен как приватный).
, но в следующем коде:
PHP:
class C1 {
  public $x = '';
  private  function __construct($x = 1){
    $this->x = $x;
  }
  public static function create($x = 1){
    return new static($x);
  }
}
class C2 extends C1 {

}
var_dump(C2::create(777));
, нормально отнаследованный конструктор отработает. Результат будет:
object(C2)[2]
public 'x' => int 777
3)
В коде:
PHP:
class D {
  public $d = 5;

  public function add_d(){
    $this->d++;
  }

  public function do_something(){
    // это:
    $this->add_d();
    // отработает как и это:
    //self::add_d();
    // и как это:
    //D::add_d();
    // и даже как это:
    //static::add_d();

  }
}
$d = new D;
$d->do_something();
var_dump($d);
Выведет:
object(D)[2]
public 'd' => int 6
Вопросы:
2.1) В чем практическое применение вызова НеСтатического метода внутри объекта через :: ? В Зандстре читал что так можно делать только для parent.
Через self или ИмяКласса я смотрю можно зацепиться за метод, который не переопределится в потомках. Это для чего то надо?
Или что?
2.2) По идее если метод класса никак не привязан к текущему объекту (как следствие $this внутри никак не используется), то обязательно его объявлять статическим?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
1. В доках про свойства сказано, что поддержку добавили в 5.3
2. В твоем случае, приватный конструктор вызван внутри класса, что автоматически дает ему нужную область видимости.
Вызвать снаружи new C2(777); ты не сможешь.
2.1 Насколько знаю, это работает для обратной совместимости, и выкидывает уведомление типа E_STRICT
2.2 Нет. Неиспользование $this не говорит о том, что он не статический.
 

Dez

Новичок
to флоппик
1. Там про добавление nowdoc сказано
2. То я видимо в самой мысле запутался - той что я указал в цитате
2.1. никаких не выдает уведомлений (у меня error_reporting = E_ALL | E_STRICT)
2.2. в смысле не говорит о том что он статический?
 

Dez

Новичок
А не встречали где то описание как вся эта объектная кухня реализована в php изнутри?
Имеется ввиду построение какой то таблицы виртуальных методов, по которой определяется какой метод текущий вызывать, и тому подобное.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А не встречали где то описание как вся эта объектная кухня реализована в php изнутри?
Имеется ввиду построение какой то таблицы виртуальных методов, по которой определяется какой метод текущий вызывать, и тому подобное.
Use the source, Luke!
 

Тугай

Новичок
Я тоже наступал на грабли PHP ООП, и это связно с динамическим свойствами языка. Тут более широкая модель, котрую толком никто не описал и тем более не формализовал в какой-то книге или моногорафии.
Как частный случачай такого отбражения PHP, не смотря на его популярность считают самым "убогим", в том смысле что, за что за что зацепишся везде противоречия или не стыковки c так называемой "классикой".
Совет не соиит закапываться как оно реализовано глубоко, потому-что там не проходимый лес и темный лес.
Java - огромный мир, но PHP в реализации с не сторогой типизацией - это просто вселенная (можно отравться от Земли и улететь на Луну или Марс и назвать это Phyton - но чтоб лететь дальше нужен PHP) .

На PHP легко подражать Java, но наоборот с Java можно просто ржать. :)
 

Тугай

Новичок
Ну давайте о мне поговорим, это всегда приятно. Нет водки пока хватает. :)
 
Сверху