以下是我的情况:我有一个类似于这样的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"
看起来这可以使用late static bindings在php 5.3中完成,但是有什么办法可以在PHP 5.2.x中完成这个行为吗?
答案 0 :(得分:3)
不是真的。这就是LSB被添加到5.3的原因。实例化是在这个地方与单身人士一起去的方式。
答案 1 :(得分:2)
Yeh后期静态绑定是要走的路。也许你现在使用的是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;
}
}
答案 2 :(得分:1)
实例化原因类是一个选项!
<?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的唯一方法&lt; 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"
答案 3 :(得分:0)
是否可以选择实例化类?