我只是想知道在PHP中使用静态方法。我有一个具有公共静态方法的类。
class Dog{
public static function sound(){
$bark = "WOOF!";
return $bark;
}
}
$new = new Dog();
$new->sound();
它返回致命错误。 所以当我打电话给这堂课时。我创建了一个新实例,然后调用它,但它给了我一个错误。它指的是什么对象?什么是非对象?
感谢。
更新: 致命错误:调用非对象上的成员函数
答案 0 :(得分:4)
您可以访问静态方法:
Dog::sound();
如果你没有声明你的sound()方法静态,那么它将是:
$dog = new Dog();
$dog->sound();
所以你的代码可能是:
class Dog{
public static function staticSound(){
$bark = "WOOF!";
return $bark;
}
public function objectSound(){
$bark = 'Woof';
return $bark;
}
}
$dog = new dog();
echo $dog->objectSound();
echo Dog::staticSound();
答案 1 :(得分:2)
PHP中的静态方法以这种方式调用:
Dog::sound();
静态和非静态方法之间的区别在于静态方法无法访问$ this变量。此外,静态方法在类上调用,而不是在该类的实例上调用。
注意:你只会得到一个致命的错误,因为你在return语句中有一个拼写错误 - 你的语法会非常有用,因为PHP是非常可以原谅的,并且允许调用一个静态方法非静态方式。
答案 2 :(得分:1)
可以创建实现静态方法的类的实例。
静态调用该方法是非法的。
调用你将使用的静态方法
Dog::sound();
并且在Dog::sound
$this
中将无法使用,因为您在类上调用它而不是实例。
对于奖励,静态方法也可以通过以下方式调用:
来自班级内的
self::sound();
static::sound();
从扩展类
static::sound();
从任何地方
$a = array("Dog","sound");
$a();
call_user_func($a);
$d= "Dog"; $s = "Sound";
$d::$s();
$d = new Dog();
$d->sound();
答案 3 :(得分:1)
在PHP中,您必须在类上调用静态方法,而不是在实例上调用静态方法。这实际上每个OOP语言都有所不同 - 有些确实允许这样做,因此混淆是可以理解的,但PHP之所以不是因为它没有强类型,因此不允许编译器安全地确定{{的类型1}}在调用期间。
正确的语法是$dog
。
答案 4 :(得分:1)
您可以从以下实例调用静态方法:
$dog = new Dog();
$dog::sound();
但你应该像这样调用静态方法
Dog::sound();
答案 5 :(得分:1)
如果$new->sound();
触发调用非对象上的成员函数,则意味着您正在尝试调用非成员函数(sound()
)一个对象($new
)。这是真正的问题,它不能由您发布的代码触发。我很确定你在实际代码中得到了这个错误,但你发布了一个不能重现问题的简化版本。
您发布的简化代码应该可以正常工作,但当然它不会打印或使用返回的值。通过一些修复,我们可以看到调用静态方法的两种方法都是有效的:
<?php
error_reporting(-1);
class Dog{
public static function sound(){
$bark = "WOOF!";
return $bark;
}
}
$new = new Dog();
echo Dog::sound();
echo $new->sound();
The manual可能不会明确说明,但暗示确认可以这样做:
将类属性或方法声明为静态可使它们可访问 没有需要类的实例化。
[...]因为静态方法可以在没有实例的情况下调用 对象创建后,伪变量$ this在里面不可用 声明为static的方法。
不是强制性并不是被禁止的。
无法使用该对象访问静态属性 箭头操作符
->
。
属性,而不是方法。
静态调用非静态方法会生成E_STRICT级别 警告。
这是相反的事情,明确记录为不允许
答案 6 :(得分:-3)
你不能在实例化的对象上调用静态方法,你必须在你的例子中调用它:
Dog.sound();
这是静态方法在大多数语言中使用的方式