为什么在PHP中你可以通过某个类的实例访问静态方法,但不仅仅是通过类型名称?
更新:我是.net开发人员,但我也与php开发人员合作。最近我发现了关于从实例调用的静态方法的这一刻,并且无法理解为什么它可以是有用的。
实施例
class Foo
{
public static Bar()
{
}
}
我们可以接受这样的方法:
var $foo = new Foo();
$foo.Bar(); // ??????
答案 0 :(得分:33)
在PHP中
使用new关键字实例化类;
$MyClass = new MyClass();
可以使用范围解析运算符或对象引用运算符来访问静态方法或属性。例如,如果类MyClass
包含静态方法Foo()
,那么您可以通过任何一种方式访问它。
$MyClass->Foo();
或
MyClass::Foo()
唯一的规则是静态方法或属性不在对象上下文中。例如,您不能在静态方法中使用$this
。
答案 1 :(得分:13)
Class Do {
static public function test() {
return 0;
}
}
像这样使用:
echo Do::test();
答案 2 :(得分:5)
为什么在PHP中你可以通过某个类的实例访问静态方法,但不仅仅是通过类型名称?
与.NET可能习惯的不同,PHP具有动态类型。考虑:
class Foo
{
static public function staticMethod() { }
}
class Bar
{
static public function staticMethod() { }
}
function doSomething($obj)
{
// What type is $obj? We don't care.
$obj->staticMethod();
}
doSomething(new Foo());
doSomething(new Bar());
因此,通过允许通过对象实例访问静态方法,您可以更轻松地跨不同类型调用同名的静态函数。
现在我不知道是否有充分的理由允许通过->
访问静态方法。 PHP(5.3?)还支持:
$obj::staticMethod();
这可能不那么令人困惑。使用::
时,它必须是一个静态函数以避免警告(与->
不同,这允许)。
答案 3 :(得分:0)
在PHP中,虽然您可以通过引用类的实例来访问静态方法,但您并不一定需要这样做。 例如,这是一个带有静态函数的类:
class MyClass{
public static function MyFunction($param){
$mynumber=param*2;
return $mynumber;
}
您可以通过类似名称访问静态方法,但在这种情况下,您必须使用双冒号(::),而不是" - >"。
$result= MyClass::MyFunction(2);
(请注意,您也可以通过类的实例访问静态方法,使用" - >")。有关详细信息:http://php.net/manual/en/language.oop5.static.php
答案 4 :(得分:0)
在PHP 7中,您似乎绝对有必要能够进行$this->staticFunction()
。因为,如果此代码是在抽象类中编写的,并且staticFunction()
在抽象类中也是抽象的,则$this->
和self::
会产生不同的结果!
从抽象类的(非抽象)子级执行$this->staticFunction()
时,您最终会进入child::staticFunction()
。一切都很好。
但是,从抽象类的(非抽象)子级执行self::staticFunction()
时,您会遇到parent::staticFunction()
(它是抽象的),从而引发异常。
我想这只是设计不良的PHP的另一个示例。 或者我自己需要更多的咖啡...
答案 5 :(得分:0)
有时,如果我们可以在类而不是对象的上下文中访问方法和属性,则很有用。为此,您可以使用static关键字。因此,我们可以使用类名称和范围解析来访问静态方法。
class User
{ 公共静态$ name ='john';
public static function display()
{
return self::$name;
}
}
echo User :: display();
在这里,我们在User类中声明了一个静态方法。因此,如果我们声明一个静态方法,那么我们可以仅使用类名进行访问。无需创建对象即可访问那里。希望您能理解所有过程。
注意:这实际上是与常规方法的主要区别:$ this在此类方法中不可用。
阅读全文