-2

我只是想知道在 PHP 中使用静态方法。我有一个具有公共静态方法的类。

class Dog{
  public static function sound(){
     $bark = "WOOF!";
     return $bark;
  }
}

$new = new Dog(); 
$new->sound();

它返回一个致命错误。所以当我打电话给这堂课时。我创建了一个新实例,然后调用它,但它给了我一个错误。它所指的对象是什么?什么是非对象?

谢谢。

更新:致命错误:调用非对象上的成员函数

4

7 回答 7

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();
于 2013-05-31T08:05:00.027 回答
2

PHP 中的静态方法是这样调用的:

Dog::sound();

静态方法和非静态方法的区别在于静态方法无权访问 $this 变量。此外,静态方法是在一个而不是该类的实例上调用的。

注意:你只会得到一个致命错误,因为你在 return 语句中有一个拼写错误——你的语法会正常工作,因为 PHP 是非常可原谅的,并且允许以非静态方式调用静态方法。

于 2013-05-31T08:06:58.723 回答
1

可以创建实现静态方法的类的实例。

静态调用该方法是非法的。

调用您将使用的静态方法

Dog::sound();

并且 inDog::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();
于 2013-05-31T08:05:54.420 回答
1

在 PHP 中,您必须在类上调用静态方法,而不是在实例上。这实际上因 OOP 语言而异 - 有些确实允许这样做,因此混淆是可以理解的,但 PHP 之所以不这样做的原因仅仅是因为它没有强类型,因此不允许编译器在运行$dog期间安全地确定类型调用。

正确的语法是Dog::sound().

于 2013-05-31T08:06:53.067 回答
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();

看到它在行动

该手册可能没有明确说明,但隐含地确认可以做到:

将类属性或方法声明为静态使它们无需实例化即可访问。
[...]
因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。

不强制不等于被禁止。

不能使用箭头运算符通过对象访问静态属性->

属性,而不是方法。

静态调用非静态方法会生成 E_STRICT 级别的警告。

这是相反的事情,这被明确记录为不允许

于 2013-05-31T08:35:31.020 回答
1

您可以从这样的实例调用静态方法:

$dog = new Dog();
$dog::sound();

但是你应该像这样调用静态方法

Dog::sound();

见:http ://www.php.net/manual/en/language.oop5.static.php

于 2013-05-31T08:10:21.580 回答
-3

您不能在实例化对象上调用静态方法,您必须在示例中这样调用它:

Dog.sound();

这是大多数语言使用静态方法的方式

于 2013-05-31T08:04:13.103 回答