Intereting Posts
Сгенерировать AST исходного файла PHP Как загрузить одно видео с YouTube на другой канал YouTube с помощью PHP Как сохранить несколько флажков в метаданных обновлений в wordpress? Получить последнюю пару ключ-значение в массиве PHP Параметр получает «потерянный» при использовании cURL Организация дат со временем и часовыми поясами. (Преобразование в точную метку времени.) Страница таксономии CPT WordPress не работает Временной интервал PHP-резервирования Как выполнить блок кода в PHP один раз в день в главном файле шаблона? Non cron SQL-запрос с похожим возвратом по-разному в php Зависимый выпадающий список в yii возвращает пустую строку даже после проверки Отображение выбранного значения в раскрывающемся списке выберите с помощью PHP Отправка данных с PHP-скрипта на C # applicationicaon получать общие ссылки на ленту новостей facebook Проверьте, существует ли ключ в Memcache

Абстрактная статическая функция в PHP 5.3

Я относительный новичок в PHP, и я выясняю, как лучше всего реализовать код доступа к базе данных. Я пытаюсь создать несколько простых объектов доступа к базе данных – каждая таблица получает свой собственный класс, каждый экземпляр класса представляет собой строку в таблице, вы знаете, упражнение.

У меня есть код, который, кажется, работает, но некоторые из того, что я видел в Интернете, заставляют меня беспокоиться, что мой подход может быть неправильным. И так как «Могу ли я это сделать?» и «СЛЕДУЕТ Я это сделаю?» это два разных вопроса, я надеялся, что некоторые ветеринары из PHP смогут перезвонить.

Моя нынешняя стратегия заключается в создании абстрактного класса таблиц базового уровня, который содержит весь общий код, а затем каждый класс, представляющий отдельную таблицу, расширяет его.

Моя основная проблема заключается в следующем:

abstract class Table { protected abstract static function get_fields(); protected abstract static function get_primary_key(); protected abstract static function get_table_name(); 

Идея состоит в том, что каждый реализующий класс будет определять имена полей, первичный ключ (ы), имя таблицы и т. Д., А затем класс Table будет использовать эти функции для заполнения конкретных пробелов, например:

 static function insert($values) { $field_list = array(); $value_list = array(); foreach (static::get_fields() as $field_name) { if (isset($values[$field_name])) { $field_list[] = $field_name; $value_list[] = self::escape($values[$field_name]); } } $field_string = join(", ", $field_list); $value_string = "'" . join("', '", $value_list) . "'"; $sql = "insert into " . static::get_table_name() . " ($field_string) values ($value_string)"; 

Как вы можете видеть, ключ заключается в том, что я обращаюсь к тем static abstract функциям, предваряя их static:: . И насколько я могу судить, это работает!

Однако принятый ответ на этот вопрос указывает, что abstract static функции до сих пор не разрешены в 5.3.

Итак, я пытаюсь понять, что с этим делать. Является ли ответ неправильным – abstract static функции теперь считаются вполне законным PHP-кодом? Я делаю что-то нецелесообразное в своем коде? Есть ли другой подход, который я должен рассмотреть?

Вот ваш пример

 abstract class Table implements iTable { public static function insert() { $class = get_called_class(); $sql = 'INSERT INTO '.$class::get_class_name(); echo $sql; } } interface iTable { static function get_class_name(); } class ConcreteTable extends Table { public function ConcreteTable() {} static function get_class_name() { return 'ConcreteTable'; } } $t = new ConcreteTable(); $t::insert(); 

В этом примере рассматривается парадигма объектов, и вы уверены, что это сработает, даже если PHP перестанет поддерживать поздние статические привязки (что, я думаю, является спецификой PHP)

Edit: Как показывают оба ответа, неизвестно, что абстрактный класс также вводит интерфейс, а также для классов, распространяющихся от него. Следуя шаблону шаблона, это возможно в PHP даже со статическими функциями (хотя и по уважительной причине, что дает строгие стандартные предупреждения). Доказательство концепции:

 abstract class Table { abstract static function get_class_name(); public static function insert() { printf('INSERT INTO %s', static::get_class_name()); } } class ConcreteTable extends Table { public static function get_class_name() { return 'ConcreteTable'; } } ConcreteTable::insert(); 

Если вы удалите статические ключевые слова здесь, вы действительно получите полезный (и стандартный способ делать вещи) код:

 abstract class Table { protected $table = NULL; public function insert() { printf('INSERT INTO %s', $this->table); } } class ConcreteTable extends Table { protected $table = 'ConcreteTable'; } $table = new ConcreteTable(); ... $table->insert(); 

Абстрактная функция никогда не будет статичной, на любом языке.

Статическая функция обеспечивает функциональность, даже если нет экземпляра.

Абстрактная функция не предоставляет никакой функциональности.

Логически, вы не можете использовать абстрактную статическую функцию, которая будет –ALWAYS AND NEVER – обеспечивать функциональность.


B расширяет A

Когда вы вызываете статическую функцию в контексте B, она будет запущена в контексте A (причина статического состояния).

Но, в контексте, эта же функция является абстрактной, вы не можете называть ее.