PHP 5.2类似虚拟的静态方法

时间:2009-05-16 18:02:48

标签: php static virtual

以下是我的情况:我有一个类似于这样的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中完成这个行为吗?

4 个答案:

答案 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)

是否可以选择实例化类?