这是我的情况:我有一个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"这看起来可以在PHP5.3中使用late static bindings来完成,但是在PHP5.2.x中有什么方法可以完成这一行为吗?
发布于 2009-05-16 18:07:34
不怎么有意思。这就是LSB被添加到5.3的原因。在这种情况下,实例化和单例是一条必由之路。
发布于 2010-05-13 19:37:16
是的,后期静态绑定是大势所趋。也许你现在使用的是PHP5.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;
}
}发布于 2009-06-19 14:38:37
实例化原因的类是一种选择!
<?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中,重新实现是唯一的方法:
<?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"https://stackoverflow.com/questions/872931
复制相似问题