#php #static
#php #статические
Вопрос:
class Foo {
public static function foobar() {
self::whereami();
}
protected static function whereami() {
echo 'foo';
}
}
class Bar extends Foo {
protected static function whereami() {
echo 'bar';
}
}
Foo::foobar();
Bar::foobar();
ожидаемый результат foobar
фактический результат foofoo
что еще хуже, сервер ограничен php 5.2
Комментарии:
1. В PHP 5.3 появились поздние статические привязки . Похоже, вам не повезло с 5.2
Ответ №1:
Все, что вам нужно, — это изменение одним словом!
Проблема заключается в том, как вы вызываете whereami(), вместо self:: вам следует использовать static:: . Итак, класс Foo должен выглядеть следующим образом:
class Foo {
public static function foobar() {
static::whereami();
}
protected static function whereami() {
echo 'foo';
}
}
Другими словами, ‘static’ фактически делает вызов whereami() динамическим 🙂 — это зависит от того, в каком классе выполняется вызов.
Ответ №2:
Попробуйте использовать одноэлементный шаблон:
<?php
class Foo {
private static $_Instance = null;
private function __construct() {}
private function __clone() {}
public static function getInstance() {
if(self::$_Instance == null) {
self::$_Instance = new self();
}
return self::$_Instance;
}
public function foobar() {
$this->whereami();
}
protected function whereami() {
print_r('foo');
}
}
class Bar extends Foo {
private static $_Instance = null;
private function __construct() {}
private function __clone() {}
public static function getInstance() {
if(self::$_Instance == null) {
self::$_Instance = new self();
}
return self::$_Instance;
}
protected function whereami() {
echo 'bar';
}
}
Foo::getInstance()->foobar();
Bar::getInstance()->foobar();
?>
Ответ №3:
Разве вам не нужно перезаписывать родительскую функцию foobar() тоже?
class Foo {
public static function foobar() {
self::whereami();
}
protected static function whereami() {
echo 'foo';
}
}
class Bar extends Foo {
public static function foobar() {
self::whereami();
}
protected static function whereami() {
echo 'bar';
}
}
Foo::foobar();
Bar::foobar();