为什么PHP不允许将类变量指定为对象?

时间:2016-02-11 10:42:02

标签: java php

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

在java中你可以这样做

private ServerSocket serverSocket;

但是在PHP中,如果你尝试做类似下面的事情

private $var = \MY_CLASS

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

3 个答案:

答案 0 :(得分:1)

不幸的是,您只能添加一个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
}

答案 1 :(得分:1)

大多数解释器 - 包括PHP - 是一种带有“自由类型数据”的语言(松散类型语言):

Strong and weak typing What is the difference between a strongly typed language and a statically typed language?

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

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

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

答案 2 :(得分:0)

作为替代方案,您可以使用类型提示注释来启动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);