通过学习fuelPHP,我被介绍了使用范围解析调用类,或者说是::。通常,当我们调用类中的方法时,我们会这样做......
$myclass = new myclass();
$myclass->mymethod();
在燃料上,通常以这种方式调用方法......
myclass::mymethod();
我想知道这两者之间有什么区别吗?范围分辨率是否也是 5.3 的更新......如果不是,哪个是理想的,或者我应该什么时候使用这些。
谢谢。
范围解析运算符用于访问类常量::const
,如静态变量::$var
或调用静态方法,如::method()
.
见http://php.net/manual/en/language.oop5.static.php
静态方法可以在没有定义它们的类的实例的情况下调用。它们是在该类中使用static
关键字定义的。
例如,CakePHP 的静态方法之一是这样定义的:
class ClassRegistry {
// ...
public static function &getInstance() {
// ...
}
}
...你可以这样称呼它ClassRegistry::getInstance()
。
如果没有static
关键字,您需要一个ClassRegistry
类的实例来调用该函数。
您可以在这里阅读更多内容,尤其是关于为什么static
在您自己的代码中使用方法有时可能是一个坏主意: http: //kore-nordmann.de/blog/0103_static_considered_harmful.html
我认为了解为什么会有静态调用以及它在幕后做什么的最好方法是查看这个 FuelPHP 博客的条目:http ://fuelphp.com/blog/2011/05/why-did-you-do-那
明显的区别是第一个解决方案$myObject->myMethod()
是动态调用:您需要一个实例来执行myMethod()
。
在第二种解决方案中,MyClass::myMethod()
是静态调用。该类充当函数所属的一种命名空间。你不需要一个实例。
我不确定如何myclass::mymethod();
工作,因为我只在调用STATIC
类时才使用这种语法。
MyClass::DoSomething();
会调用一个名为 DoSomething() 的静态方法
尽管
$instance = new MyClass();
$instance->DoSomething();
会调用实例方法。
我还没有测试过,但我相信如果你这样做,你会遇到错误$instance::DoSomething()