我有一个父类和许多子类.子类中有一个静态变量,父类中有一个静态方法.我需要调用子类继承的静态方法,获取子类的中定义的静态变量.执行代码后系统提示Access to undeclared static property: model::$table
他在查找model::$table,也就是说他查找的是父类中的$table变量.可是我的$table是在子类中定义的,同时我是调用的子类的get_table()方法.为什么他不查找child_model::$table.还有就是父类中许多地方要用到子类中定义的$table方法.在父类中使用self::$table后.在执行子类中继承的方法 ,也是无法访问子类中定义的静态变量的.怎么解决啊?
class model{
//获取子类中定义的静态变量
  public static function get_table()
    {
return self::$table;
    }
//实例化子类后使用子类中定义的静态变量
  somefunction(){
       echo(self::$table);
    }
}//子类
class child_model extends model{
public static $table = 'some_table';
}//调用子类继承的静态方法
echo chile_model::get_table();
//实例化子类后使用子类中的静态变量
$cm = new child_model();
$cm -> somefunction();

解决方案 »

  1.   

    问题是出在self上,隐约记得self和this都是指当前域(可能不准确,你可以google下),所以你在调用相关的办法的时候子类的static $table是不再期内的,所以需要你延迟静态绑定。
    class model {
    public static function get_table(){
    return static::$table;
    }

    public function somefunction(){
    echo(static::$table);
    }
    }class child_model extends model{
    public static $table = 'some_table';
    }echo child_model::get_table();
    $cm = new child_model();
    $cm->somefunction();
      

  2.   

    return self::$table;
    这个self在程序未执行前,就被PHP解释器替换绑定为了当前类,也就是父类 model了。
    #1的办法可以解决你的问题,需要注意的是你的PHP版本要在5.3之后
      

  3.   

    可以调用静态变量了.先在出现的问题是.我原来有很多地方都使用的是
    $this ->table
    这个变量,再把table改成静态变量以后,就无法访问$this_table了这个怎么解决呢
    换句话说就是希望子类的静态变量$table 在子类实例化以后,父类方法中可以访问$this->table
    我尝试过吧子类的$table改成$table2 然后父类定义方法
    报错:Fatal error: Cannot access empty property in D:\web\htdocs\soufun\index.php on line 15
    class model{
    public $table;
    public function __construct()
    {
    $table = static::$table2;
    }
    //获取子类中定义的静态变量
      public static function get_table()
        {
    return static::$table2;
        }
    //实例化子类后使用子类中定义的静态变量
      function somefunction(){
    //注意这里,希望原来父类使用$this->table的地方继续有用
    echo($this -> $table);
        }
    }
     
    //子类
    class chile_model extends model{
    public static $table2 = 'some_table';
    }
     
    //调用子类继承的静态方法
    echo chile_model::get_table();
    //实例化子类后使用子类中的静态变量
    $cm = new chile_model();
    $cm -> somefunction();
      

  4.   

    看起来你现在很混乱
    $table = static::$table2;
    这个 $table 只是函数内的局部变量,访问类属性$table应该用 $this->table
    注意了,不是 $this->$table
      

  5.   

    实例化
    $cm = new chile_model();
    $cm -> somefunction();
    somefunction还是没法输出$table,无论是echo($this -> table);还是echo($table);都不行.难道必须用echo(static::$table2);??
    怎样才能把静态变量$table2的值赋给$table?
      

  6.   

    class model{
        public $table;
        public function __construct()
        {
    // 这里
            $this->table = static::$table2;
        }
        public static function get_table()
        {
    return static::$table2;
        }
    function somefunction(){ // 没有那个 $
        echo($this -> table);
        }
    }
      
    //子类
    class chile_model extends model{
        public static $table2 = 'some_table';
    }还是建议你能完成的看一遍手册先