Позднее статическое связывание: какие языки, обычно используемые для веб-разработки, поддерживают его? - PullRequest
2 голосов
/ 15 декабря 2008

В последнее время я много болтаю об отсутствии позднего статического связывания в PHP до версии 5.3.

Из того, что я прочитал, правильные реализации таких вещей, как ActiveRecord, невозможны, пока язык не имеет этой функции.

Итак, мне интересно:

  • Какие языки поддерживают это, особенно те, которые обычно связанный с веб-разработкой, такой как Python, Ruby, Perl, Java, C #, (JavaScript?).
  • Которые на самом деле используют его на на регулярной основе?

Ответы [ 4 ]

4 голосов
/ 15 декабря 2008

Если вы хотите обойти эту проблему, которая, по общему признанию, занимает немного времени, но все же будет легко удалена, когда php 5.3 станет доступным и встроенным, вы можете попробовать следующий код.

class Specific_Model extends Model{

    public static function GetAll($options = null){

        parent::GetAll($options, get_class());

    }

}


class Model{

    public static function GetAll($options = null, $class = null){

       if(is_null($class)) $class = get_class();  

       /* Do stuff here */

    }

}

Тогда вы можете использовать следующий код ...

Specific_Model::GetAll($options);

И легко убрать лишний код при переходе на php 5.3.

0 голосов
/ 18 апреля 2009

Без поздней статической привязки интерпретатор PHP привязывает функцию hello () к классу A, когда программист четко выражает функцию в классе B. Отсутствие поздней статической привязки приведет к выводу «hello», а не «bye» "несмотря на то, что hello () вызывается в классе B.

0 голосов
/ 16 декабря 2008

Концепция «Позднего статического связывания» - это хак, чтобы исправить тот факт, что в PHP статически объявлены классы. Большинство динамических языков имеют объектную систему, где класс является объектом. PHP, с другой стороны, сохраняет код и среду выполнения полностью разделенными (как C / C ++). Это имеет множество странных последствий, без которых нам было бы лучше.

0 голосов
/ 15 декабря 2008

Я совершенно не понял, что такое поздняя статическая привязка. Вот что говорит Википедия .

Позднее статическое связывание является вариантом [имя] привязка где-то между статическим и динамическое связывание. Рассмотрим следующий пример PHP:

class A {
    static $word = "hello";
    static function hello() {print self::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();

Без позднего статического связывания PHP интерпретатор связывает функцию hello() в класс А, когда программист четко выражая функцию на class B. Отсутствие поздней статики привязка приведет к тому, что "привет" будет напечатано, не "пока" несмотря на hello() вызывается на class B.

Поздний статический Обязательность в переводчике означает, что $word определяется во время выполнения. В этот случай будет ссылаться B::$word если B::hello() вызывается и A::$word если A::hello() называется. Это делает потребовать изменения ключевых слов из self до static (возможно, доступно начиная с PHP 5.3) в A::hello()

class A {
    static $word = "Welcome";
    static function hello() {print static::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...