【问题标题】:PHP properties overloadingPHP 属性重载
【发布时间】:2014-06-17 16:11:29
【问题描述】:

下面的代码有什么问题?

$inFile 和 $outFile 总是由 machine1 而不是 machine2 初始化,这意味着对于 machine2 的实例,machine1 的配置被打开(并写入)。

我做错了什么? 我理解$this->somevar指的是实际实例化的对象(machine2)。

谢谢。

class machine1
{
    private  $inFile = "Config.ini";
    private  $outFile = "Config.web";
    
    public $fileArray = array();
    
    
    public function LoadData()
    {
        $handle = fopen(paths::$inifiles . $this->inFile,"r");
        // Read the file
        fclose($handle);
    }
    
    public function SaveData()
    {
        $handle = fopen(paths::$inifiles . $this->outFile,"w");
        //write the file
        fclose($handle);
    }
}
class machine2 extends machine1
{
    private  $inFile = "Config_1.ini";
    private  $outFile = "Config_1.web";
}

$obj = new machine2();
$obj->LoadData();
$obj->SaveData();

【问题讨论】:

    标签: php inheritance


    【解决方案1】:

    您正在使用private 作为变量。这意味着子类不能继承、使用或重新定义它们。

    尝试将它们更改为protected,我敢打赌它会起作用。你可以在这个帖子中阅读更多关于它们的信息:https://stackoverflow.com/a/4361582/2370483

    【讨论】:

      【解决方案2】:

      使它们受到保护而不是私有。

      protected $inFile = "Config.ini";
      protected $outFile = "Config.web";
      

      【讨论】:

        【解决方案3】:

        最好的解决方案应该是使用构造函数初始化这些变量。例如

        in machine1:
        public function __construct($inFile="Config.ini",$outFile="Config.web"){
            $this->inFile= $inFile;
            $this->outFile= $outFile;
        }
        
        in machine2:
        public function __construct(){
            parent::__construct("Config_1.ini","Config1.web");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 2011-06-17
          • 2012-09-15
          • 2014-02-18
          相关资源
          最近更新 更多