使用静态方法创建类的新实例是不正确的吗?

时间:2013-05-31 08:02:20

标签: php function static

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

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

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

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

感谢。

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

7 个答案:

答案 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();

请参阅:http://www.php.net/manual/en/language.oop5.static.php

答案 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();

in action

The manual可能不会明确说明,但暗示确认可以这样做:

  

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

不是强制性并不是被禁止的。

  

无法使用该对象访问静态属性   箭头操作符->

属性,而不是方法。

  

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

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

答案 6 :(得分:-3)

你不能在实例化的对象上调用静态方法,你必须在你的例子中调用它:

Dog.sound();

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