【问题标题】:Class works without declaring variables?类在没有声明变量的情况下工作?
【发布时间】:2012-04-06 11:20:07
【问题描述】:

我学习 php 作为函数式和过程语言。现在尝试开始学习目标导向并得到一个重要的问题。

我有代码:

class car {

    function set_car($model) {
        $this->model = $model;
    }

    function check_model()
    {
        if($this->model == "Mercedes") echo "Good car";
    }

}

$mycar = new car;
$mycar->set_car("Mercedes");

echo $mycar->check_model();

为什么不声明 $model 就可以工作?

var $model; 开头?

因为在 php 中对任何变量都适用“自动声明”? 我卡住了

【问题讨论】:

    标签: php oop


    【解决方案1】:

    PHP 中的每个对象都可以在不声明它们的情况下获得成员:

    $mycar = new car;
    $mycar->model = "Mercedes";
    echo $mycar->check_model(); # Good car
    

    这是 PHP 的默认行为。那些是公开的。见manual

    【讨论】:

    • 是的,您可以这样做,但这并不意味着您应该。值得向 OP 解释一下吗?
    • 可以不代表你也不应该,那该怎么解释呢?它是未定义的(动态成员),它是公共的 - 答案中都提到了两者。你特别关心什么?
    • 我不认为这是非常好的 OO 设计,除非它是绝对必要的(即使那样我也很难想出一个绝对必要的案例)。鉴于 OP 是 PHP 的新手(我猜也是 OO 的新手),我们不应该指出他的危险吗?默认情况下应该声明所有类属性。
    • 是的,我认为应该提到它。例如,如果您在 set_car 之前或在您自己设置属性之前调用 check_model,该类将吐出未定义的属性通知。
    【解决方案2】:

    是的,如果它不存在,PHP 会即时为您声明它。

    无论如何定义它会更优雅,并且在使用扩展时建议使用它,因为如果您的扩展将使用相同的 varnames 并且不将其定义为私有、受保护或公共,您可能会遇到奇怪的情况。

    更多信息: http://www.php.net/manual/en/language.oop5.visibility.php

    【讨论】:

      【解决方案3】:

      可以随时创建 PHP 类成员。这样,它将被视为 public 变量。要声明一个私有变量,您需要声明它。

      【讨论】:

        【解决方案4】:

        是的。但是这种方式变量将是公开的。并且不推荐使用声明为“var”的类变量 - 使用公共、受保护或私有。

        【讨论】:

          【解决方案5】:

          不,这是因为 $model 是函数 set_car 的参数。参数并不完全是变量,而是调用函数(或类方法)时将设置的变量或值的占位符(引用)。例如,$model 在调用 set_car 时取值“Mercedes”。

          【讨论】:

          • 问题与函数参数无关。 $model 和 $this->model 是不同的变量。它可能是 $modelName 或其他东西。无论如何它都有效
          【解决方案6】:

          我认为这种行为会导致错误。 让我们考虑一下这段代码有一个错误

          declare(strict_types=1);
          
          class A
          {
              public float $sum;
              public function calcSum(float $a, float $b): float
              {
                  $this->sum = $a;
                  $this->sums = $a + $b; //misprinted sums instead of sum
                  return $this->sum;
              }
          }
          
          echo (new A())->calcSum(1, 1); //prints 1
          

          即使我使用 PHP 7.4+ 类型提示等,编译器和带有代码检查器的 IDE 都找不到这个错字。

          【讨论】:

            猜你喜欢
            • 2021-11-30
            • 1970-01-01
            • 2014-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-21
            相关资源
            最近更新 更多