PHP 5.2 Виртуальные статические методы - PullRequest
4 голосов
/ 16 мая 2009

Вот моя ситуация: у меня есть базовый класс PHP, который выглядит примерно так:

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . self::$table_name;
  }
}

И такой подкласс:

class MyTable extends Table {
  static $table_name = "my_table";
}

К сожалению, когда я делаю:

MyTable::selectAllSQL()

Я получаю:

"SELECT * FROM table"

вместо желаемого результата,

"SELECT * FROM my_table"

Похоже, что это может быть достигнуто в php 5.3 с использованием поздние статические привязки , но есть ли способ, которым я могу добиться этого в PHP 5.2.x?

Ответы [ 4 ]

3 голосов
/ 16 мая 2009

Не совсем. Вот почему LSB был добавлен в 5.3. Инстанция - это путь в этом месте вместе с синглтоном.

2 голосов
/ 13 мая 2010

Да, поздняя статическая привязка - путь. Может быть, вы сейчас на PHP 5.3. Вот как это должно выглядеть тогда:

Изменение

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . self::$table_name;
  }
}

до

class Table {
  static $table_name = "table";
  public function selectAllSQL(){
    return "SELECT * FROM " . static::$table_name;
  }
}
1 голос
/ 19 июня 2009

Определить класс причины можно!

<?php
abstract class Table {
    protected $table_name;
    public function selectAllSQL() {
        return 'SELECT * FROM ' . $this->table_name;
    }
}

class MyTable extends Table {
    protected $table_name = 'my_table';
}

$my_table = new MyTable();
echo $my_table->selectAllSQL(); // Will output "SELECT * FROM my_table"

Если вам нужно сохранять статичность, то переопределение - это единственный путь в PHP <5.3: </p>

<?php
abstract class Table {
    protected static $table_name = 'table';
    public static function selectAllSQL() {
        return self::selectAllSQLTable(self::$table_name);
    }
    public static function selectAllSQLTable($table) {
        return 'SELECT * FROM ' . $table;
    }
}

class MyTable extends Table {
    protected static $table_name = 'my_table';
    public static function selectAllSQL() {
        return self::selectAllSQLTable(self::$table_name);
    }
}

class MyOtherTable extends Table {
    protected static $table_name = 'my_other_table';
    public static function selectAllSQL() {
        return self::selectAllSQLTable(self::$table_name);
    }
}

echo MyTable::selectAllSQL(); // Will output "SELECT * FROM my_table"
echo MyOtherTable::selectAllSQL(); // Will output "SELECT * FROM my_other_table"
0 голосов
/ 16 мая 2009

Будет ли возможность создавать экземпляры классов?

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