【问题标题】:PHP - Private variable accessible through ClassPHP - 可通过类访问的私有变量
【发布时间】:2018-01-09 06:31:22
【问题描述】:

我正在研究一个看起来像这样的 PHP 类:

<?php
    class xyz{
           public $car1;
           public $car2;
           private $owner;

            public function __construct ($type){
              $this->car1 = $type;
              $this->owner = "John";
              return $this->owner();
          }
            private function owner(){
             return "Owner of ".$this->car1." is ".$this->owner;
          }

现在,当我通过其他代码调用这个类时,我可以很容易地访问私有变量并且返回函数不能正常工作。

示例如下:

  <?php
    $car = new xyz("Sedan");
    echo $car; //Expected result: Owner of Sedan is John.
   ?>

如果我打印 $car,这就是我得到的结果

 Object ( [car1] => Sedan [car2] => "" [owner:xyz:private] => John )

如何实现我想要的结果以及如何保护私有变量?

我们将不胜感激所有帮助和建议。

谢谢!

【问题讨论】:

  • 你不能从构造函数返回。只需回显$car-&gt;owner() 或可能使用__toString()
  • 你不能回显一个类,你应该在它里面有一个函数。
  • @Phiter 你可以回显一个类,但你需要定义__toString 魔法方法。
  • 哦,很高兴知道,谢谢!
  • protect private variable 来自什么

标签: php class private-members


【解决方案1】:
  1. 构造函数不应该返回任何值。类构造函数应该在创建新实例时初始化对象(例如,当您编写 $car = new xyz("sedan"); 时,因此您返回的任何内容都无处可去。在类中创建其他方法以返回值。
  2. 如果要回显所有者,请将owner 方法公开并执行`echo $car->owner();"。该方法返回一个字符串,然后回显该字符串。简单。
  3. 直接回显对象应该会导致 php 7 出现错误,也许您正在运行旧版本的 php,它返回您所看到的内容,如果您调用 var_dump($car); 会发生这种情况。如果要控制如何将对象转换为字符串,则需要重写__toString 方法(参见php documentation)。
  4. 属性和方法可见性关键字工作正常,如果您尝试使用 $car-&gt;owner$car-&gt;owner() 而不更改可见性,您应该会看到错误。

【讨论】:

  • @ 3,我使用的是 print_r,而不是 echo。但是 __toString 有效!
  • 有什么建议可以保护私人数据不被课外访问吗?
  • 私有数据不会在课堂外被访问,这是 OOP 基础知识。
猜你喜欢
  • 2015-11-27
  • 2015-09-25
  • 2015-11-15
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2015-04-07
  • 2011-07-14
相关资源
最近更新 更多