PHP如何实例化这个类?
我有一行PHP调用一个新类:PHP如何实例化这个类?,php,zend-framework,software-design,Php,Zend Framework,Software Design,我有一行PHP调用一个新类: $habits = new \Order\VO\Habits(); 对我来说,这看起来像是一个静态方法调用,但我不知道到底发生了什么。我知道在名称空间后面有一个类,它只是一个包含一系列变量的类。我可以看出这个类正在被实例化,但我不明白以这种方式进行的目的是什么。我从来没有见过PHP中有这样一个类,所以任何关于它实际上是什么以及为什么以这种方式调用该类的文档都会非常有用 我参与的项目使用Zend框架,所以我不确定这是否是框架本身特有的东西 编辑: 调用类的方式不是问
$habits = new \Order\VO\Habits();
对我来说,这看起来像是一个静态方法调用,但我不知道到底发生了什么。我知道在名称空间后面有一个类,它只是一个包含一系列变量的类。我可以看出这个类正在被实例化,但我不明白以这种方式进行的目的是什么。我从来没有见过PHP中有这样一个类,所以任何关于它实际上是什么以及为什么以这种方式调用该类的文档都会非常有用
我参与的项目使用Zend框架,所以我不确定这是否是框架本身特有的东西
编辑:
调用类的方式不是问题,我只是想更多地了解调用was类的功能,以及为什么以这种方式调用这个特定类比简单地使用
$habits = new habits();
当实例化一个类时(在PHP5中,至少99%的时间)调用
\uu construct()
函数
class Foo {
public $bar;
public function __construct($arg) {
$this->bar = $arg;
}
}
$class = new Foo('test');
echo $class->bar; // Ouput: test
在名称空间中,类位于基本上是目录的内部。以Foo
为例。我不能将两个类命名为同一事物,但我可以在命名空间下放置另一个Foo
namespace Example;
class Foo {
public static function dump($arg) {
echo $arg;
}
}
<?php
namespace Order\VO {
class Habits {
function __construct() {
echo "New VO Habits\n";
}
}
}
namespace Lifehacks {
class Habits {
function __construct() {
echo "New Lifehack Habits\n";
}
}
}
namespace {
// PHP Fatal error: Class 'Habits' not found
// $foo = new Habits();
// Prints "New VO Habits"
$foo = new \Order\VO\Habits();
// Prints "New Lifehack Habits"
$bar = new \Lifehacks\Habits();
}
所以现在我们需要参考我们想要的Foo
。我们可以通过传递完整的名称空间来实现这一点
$class = new \Foo('test'); // The original Foo is in root namespace
\Example\Foo::dump('test');
或者使用使用
use Example\Foo;
Foo::dump('test'); // alias here so we don't need to redeclare the path
现在,PHP不会“自动”加载类。相反,常见的做法是使用一个名称空间,然后将文件放入与名称空间匹配的目录中。因此,\Example\Foo
将生活在Example/Foo.php
中,当您调用该类时,您的自动加载器将只包含该文件。当您实例化它正在调用的类时(在PHP5中至少99%的时间)调用\uu construct()
函数
class Foo {
public $bar;
public function __construct($arg) {
$this->bar = $arg;
}
}
$class = new Foo('test');
echo $class->bar; // Ouput: test
在名称空间中,类位于基本上是目录的内部。以Foo
为例。我不能将两个类命名为同一事物,但我可以在命名空间下放置另一个Foo
namespace Example;
class Foo {
public static function dump($arg) {
echo $arg;
}
}
<?php
namespace Order\VO {
class Habits {
function __construct() {
echo "New VO Habits\n";
}
}
}
namespace Lifehacks {
class Habits {
function __construct() {
echo "New Lifehack Habits\n";
}
}
}
namespace {
// PHP Fatal error: Class 'Habits' not found
// $foo = new Habits();
// Prints "New VO Habits"
$foo = new \Order\VO\Habits();
// Prints "New Lifehack Habits"
$bar = new \Lifehacks\Habits();
}
所以现在我们需要参考我们想要的Foo
。我们可以通过传递完整的名称空间来实现这一点
$class = new \Foo('test'); // The original Foo is in root namespace
\Example\Foo::dump('test');
或者使用使用
use Example\Foo;
Foo::dump('test'); // alias here so we don't need to redeclare the path
现在,PHP不会“自动”加载类。相反,常见的做法是使用一个名称空间,然后将文件放入与名称空间匹配的目录中。因此,\Example\Foo
将生活在Example/Foo.php
中,您的自动加载程序在调用该类时只会包含该文件。这是因为您正在使用名称空间实例化该类,您也可以通过以下方式执行:
<?php
use Order\VO\Habits;
$habits = new Habits();
这是因为您正在用名称空间实例化类,也可以这样做:
<?php
use Order\VO\Habits;
$habits = new Habits();
一个简单完整的例子可能会有所帮助。在这里,我使用大括号的名称空间语法将代码限定为一个文件中的三个名称空间,\Order\VO
,\Lifehacks
,以及全局名称空间
namespace Example;
class Foo {
public static function dump($arg) {
echo $arg;
}
}
<?php
namespace Order\VO {
class Habits {
function __construct() {
echo "New VO Habits\n";
}
}
}
namespace Lifehacks {
class Habits {
function __construct() {
echo "New Lifehack Habits\n";
}
}
}
namespace {
// PHP Fatal error: Class 'Habits' not found
// $foo = new Habits();
// Prints "New VO Habits"
$foo = new \Order\VO\Habits();
// Prints "New Lifehack Habits"
$bar = new \Lifehacks\Habits();
}
一个简单完整的例子可能会有所帮助。在这里,我使用大括号的名称空间语法将代码限定为一个文件中的三个名称空间,\Order\VO
,\Lifehacks
,以及全局名称空间
namespace Example;
class Foo {
public static function dump($arg) {
echo $arg;
}
}
<?php
namespace Order\VO {
class Habits {
function __construct() {
echo "New VO Habits\n";
}
}
}
namespace Lifehacks {
class Habits {
function __construct() {
echo "New Lifehack Habits\n";
}
}
}
namespace {
// PHP Fatal error: Class 'Habits' not found
// $foo = new Habits();
// Prints "New VO Habits"
$foo = new \Order\VO\Habits();
// Prints "New Lifehack Habits"
$bar = new \Lifehacks\Habits();
}
尝试更简洁的解释<代码>$habits=新习惯()代码>不起作用,因为类名是Order\VO\Habits
,而不是Habits
。为了方便起见,您可以像byoigres的回答一样导入名称空间,这告诉PHP类Habits
实际上意味着Order\VO\Habits
。之后,$habits=newhabits()代码>将起作用。尝试更简洁的解释<代码>$habits=新习惯()代码>不起作用,因为类名是Order\VO\Habits
,而不是Habits
。为了方便起见,您可以像byoigres的回答一样导入名称空间,这告诉PHP类Habits
实际上意味着Order\VO\Habits
。之后,$habits=newhabits()代码>将起作用。是什么使它看起来像一个静态方法调用?这不是Habits::static_method()吗?它们只是使用完全限定的类名。我只是不熟悉在PHP中实例化类的这种特殊方法。为什么不像实例化任何其他类那样简单地执行“新习惯”?使用它的好处是什么?PHP如何知道如何处理该语句?请看-现在我的同事和我都可以拥有一个名为Foo
的类,只要我们用“自己的”名称空间将它们分开。是的,没错。举例来说,如果在像Zend和相关组件这样大的东西中,会有几个同名的类,那么消除它们的歧义也就不足为奇了。如果新调用和habits类共享一个命名空间,这与$habits=new habits()
所做的完全相同。是什么使它看起来像一个静态方法调用?这不是Habits::static_method()吗?它们只是使用完全限定的类名。我只是不熟悉在PHP中实例化类的这种特殊方法。为什么不像实例化任何其他类那样简单地执行“新习惯”?使用它的好处是什么?PHP如何知道如何处理该语句?请看-现在我的同事和我都可以拥有一个名为Foo
的类,只要我们用“自己的”名称空间将它们分开。是的,没错。举例来说,如果在像Zend和相关组件这样大的东西中,会有几个同名的类,那么消除它们的歧义也就不足为奇了。如果新调用和habits类共享一个名称空间,则这与$habits=new habits()
的作用完全相同。我在本例中实例化的类没有_构造方法。它只是充满了变量,根本没有方法。这并不是我所困惑的课程结构,而是为什么它的命名方式让我困惑