4

这是我的情况:我有一个看起来像这样的 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

4 回答 4

3

并不真地。这就是 LSB 被添加到 5.3 的原因。在这个地方,实例化是要走的路,还有一个单例。

于 2009-05-16T18:07:33.993 回答
2

叶晚静态绑定是要走的路。也许您现在使用的是 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;
  }
}
于 2010-05-13T11:37:15.700 回答
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 < 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"
于 2009-06-19T14:38:36.923 回答
0

实例化类是一种选择吗?

于 2009-05-16T18:04:53.813 回答