无法从PHP中的父静态方法访问子静态属性

时间:2018-02-19 21:00:49

标签: php static global-state

我在PHP代码中遇到了一些问题。我有三个名为

的类
  1. DatabaseObject
  2. 文件
  3. user_picture
  4. 从父类到子类的继承树是 DatabseObect-> File-> user_picture 。在 user_picture 中,我有一个静态属性$ table_name,我用它来了解每个类的数据库表名,并在 DatabaseObject 类中有一些常见的数据库函数。我正在使用的函数的代码在这里

    DatabaseObject类的代码

    public static function find_by_field($field="", $value="")
    {
        $result_array = self::find_by_sql("SELECT * FROM ".static::$table_name." WHERE {$field} = '".$value."'"); //Line 52
        if(empty($result_array))
        {
            return false;
        }
        else
        {
            $object = static::instantiate(array_shift($result_array));
            return $object;
        }
    }
    

    文件类代码

    public $errors=array();
    
    public $file_before_upload; // General file tyoe that has been uploaded from the form
    public $id = 0;
    public $size;
    public $file_name;
    public $file_type;
    public $user_id;
    
    protected $temp_path;
    //protected static $upload_dir="";
    
    protected $upload_errors = array(
        // http://www.php.net/manual/en/features.file-upload.errors.php
        UPLOAD_ERR_OK               => "No errors.",
        UPLOAD_ERR_INI_SIZE     => "Larger than upload_max_filesize.",
        UPLOAD_ERR_FORM_SIZE    => "Larger than form MAX_FILE_SIZE.",
        UPLOAD_ERR_PARTIAL      => "Partial upload.",
        UPLOAD_ERR_NO_FILE      => "No file.",
        UPLOAD_ERR_NO_TMP_DIR => "No temporary directory.",
        UPLOAD_ERR_CANT_WRITE => "Can't write to disk.",
        UPLOAD_ERR_EXTENSION    => "File upload stopped by extension."
    );
    public static function get_file_by_user($id = 0){
           return DatabaseObject::find_by_field("user_id",$id); //Line 164
        }
    

    user_picture类的代码

    protected static $table_name = "user_images";
        protected static $db_fields = array('id','file_name','file_type','size','user_id');
    
        public static $upload_dir ="uploads".DS."user_img";
        protected static $file_upload_limit = 15;
    
    
        public static function get_image_by_user($id = 0)
        {
            return File::get_file_by_user($id);  //Line 45
        }
    

    我在 user_picture 中调用上层函数的位置是

    $user_image = user_picture::get_image_by_user($session->user_id);
    
    $user_picture_path="";
    
    if(!$user_image)
    {
        $user_picture_path = $user_image::upload_dir.DS."default.png";
    }
    else{
        $user_picture_path = $user_image::file_path(); //Line 28
    }
    

    此代码给出了以下错误

      

    致命错误:未捕获错误:访问未声明的静态属性:C:\ xampp \ htdocs \ inventory-management \ includes \ database \ DatabaseObject.php中的DatabaseObject :: $ table_name:52   堆栈跟踪:

         

    0 C:\ xampp \ htdocs \ inventory-management \ includes \ general \ File.php(164):DatabaseObject :: find_by_field('user_id','29')

         

    1 C:\ xampp \ htdocs \ inventory-management \ includes \ user \ user_picture.php(45):File :: get_file_by_user('29')

         

    2 C:\ xampp \ htdocs \ inventory-management \ public \ admin \ layouts \ admin \ header \ Navigation.php(28):user_picture :: get_image_by_user('29')

         

    3 C:\ xampp \ htdocs \ inventory-management \ public \ admin \ layouts \ admin \ header \ admin_header.php(21):require_once('C:\ xampp \ htdocs ...')

         

    4 C:\ xampp \ htdocs \ inventory-management \ public \ admin \ add_page_category.php(44):require_once('C:\ xampp \ htdocs ...')

         

    5 {main}     抛出 C:\ xampp \ htdocs \ inventory-management \ includes \ database \ DatabaseObject.php 52

    请有人帮忙!

    谢谢,

1 个答案:

答案 0 :(得分:2)

您必须致电self而不是Database::File::

public static function get_image_by_user($id = 0)
{
    return self::get_file_by_user($id);  //Line 45
}

public static function get_file_by_user($id = 0){
   return self::find_by_field("user_id",$id); //Line 164
}

工作示例:

class A {
    static public function foo() {
        var_dump(static::$bar);
    }
}
class B extends A {
    static protected $bar = "12";

    static public function zoo(){
        self::foo();
    }
}

B::zoo();

不工作的例子:

class A {
    static public function foo() {
        var_dump(static::$bar);
    }
}
class B extends A {
    static protected $bar = "12";

    static public function zoo(){
        A::foo();
    }
}

B::zoo();