所以我有以下问题:为什么PHP不允许将类变量实例化为对象,这可能是错误的问题所以我将展示一些代码来澄清我的意思。
在java中你可以这样做
private ServerSocket serverSocket;
但是在PHP中,如果你尝试做类似下面的事情
private $var = \MY_CLASS
它将抛出语法错误,您必须通过构造函数实例化它。 我的意思是在java中你还需要通过构造函数实例化变量..
答案 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);