【问题标题】:PHP 5.2 Virtual-like static methodsPHP 5.2 类虚拟静态方法
【发布时间】:2009-05-16 18:02:47
【问题描述】:

这是我的情况:我有一个看起来像这样的 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 中使用 late static bindings 完成,但是有什么方法可以在 PHP 5.2.x 中完成此行为吗?

【问题讨论】:

    标签: php static virtual


    【解决方案1】:

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

    【讨论】:

      【解决方案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;
        }
      }
      

      【讨论】:

        【解决方案3】:

        实例化原因类别是一种选择!

        <?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

        <?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"
        

        【讨论】:

          【解决方案4】:

          可以选择实例化类吗?

          【讨论】:

            猜你喜欢
            • 2010-11-17
            • 2012-10-11
            • 2011-03-08
            • 1970-01-01
            • 1970-01-01
            • 2013-09-02
            • 2011-02-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多