为什么 PHP 不允许将类变量赋值为对象


Why doesn't PHP allow class variables to be assigned as objects?

所以我有以下问题:为什么PHP不允许类变量实例化为对象,这可能是一个错误的问题,所以我将展示一些代码来澄清我的意思。

在java中你可以这样做

private ServerSocket serverSocket;

但是在PHP中,如果您尝试执行以下操作

private $var = 'MY_CLASS

它将抛出语法错误,您必须通过构造函数实例化它。我的意思是,在java中,您还需要通过构造函数实例化变量。

大多数解释器(包括PHP)都是一种具有"自由类型数据"(松散类型语言)的语言:

强打字和弱打字强类型语言和静态类型语言有什么区别?

这只是构建语言翻译器的实践方法之一。

这并不意味着它是坏的。这只是意味着在设计应用程序的体系结构时,您负责控制数据的正确性。

但是它的真实性已经提到过,你可以使用注释机制来描述你想要做什么

不幸的是,

您只能添加 phpDoc 注释,以便 IDE 可以帮助您,但您可以将类型(类或数组原语)指定为方法的参数

namespace Services;
use Services/SubNamespace/AnotherClass;
class Test
{
    /**
    * @var AnotherClass
    */
    private $property;
    public function __construct(AnotherClass $anotherClass){ ... }
    public function addVars(array $array){ ... } //You must check your php version to make sure it supports array typehint
}

作为替代方案,您可以使用类型提示注释让您的 IDE 继续学习,这只是我对 PHP 代码的一般良好做法。下面是一个示例:

<?php
class ExampleClass {
  /** @var 'MY_CLASS */
  private $var;
  public function __construct()
  {
    $this->var = new 'MY_CLASS();
  }
}

作为面向对象的一般规则,您应该倾向于依赖注入,而不是实例化类中的新对象。 例如:

<?php
class ExampleClass {
  /** @var 'MY_CLASS */
  private $var;
  public function __construct('MY_CLASS $var)
  {
    $this->var = $var;
  }
}
$exampleVar = new 'MY_CLASS();
$exampleClass = new ExampleClass($exampleVar);