расширение статических методов в php - PullRequest
1 голос
/ 02 мая 2011
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

Ответы [ 4 ]

5 голосов
/ 05 октября 2015

Все, что вам нужно - это смена одного слова!

Проблема в том, как вы называете whereami () вместо self:: вы должны использовать static :: .Поэтому класс Foo должен выглядеть следующим образом:

class Foo {
  public static function foobar() {
    static::whereami();
  }
  protected static function whereami() {
    echo 'foo';
  }
}

Другими словами, «static» фактически делает вызов whereami () dynamic :) - это зависитв каком классе находится вызов.

0 голосов
/ 02 мая 2011

Вам не нужно перезаписывать родительскую функцию 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();
0 голосов
/ 02 мая 2011

Попробуйте использовать шаблон синглтона:

<?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();


?>
0 голосов
/ 02 мая 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...