2009-05-16 8 views
4

ここでは、私の状況です:私はこのようになりますPHP基本クラスを持っている:PHP 5.2の仮想のような静的メソッド

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

クラスをインスタンス化するオプションはありますか?

+0

に残念ながら:( –

3

LSBが5.3に追加された理由です。インスタンシエーションは、この場所でシングルトンと一緒に行く方法です。

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" 
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; 
    } 
} 
+0

それは私のための仕事です –

関連する問題