PHP类中调用函数 - 是否有更简单的方法?

3

我对面向对象编程(OOP)非常陌生,而且很久没有接触PHP了。请问这种从类中调用函数的方法是否正确?

class newclass {
    public function testfunc {
        return '1';
    }
}

我可以这样称呼它吗:

echo testfunc->newclass();

或像这样:
echo newclass()::testfunc;

我经常看到类似下面的示例中定义它,但它似乎是多余的代码吗?
$this = new newclass();
$this->testfunc();
echo $this;

非常感谢你的帮助,因为我刚开始理解这个面向对象编程的概念。如果我对此一无所知,或许有人可以推荐一个真正针对初学者的类/面向对象编程的指南链接。谢谢!

5
http://php.net/manual/en/language.oop5.php - NullUserException
5个回答

4
两种方法都可行,各有其用例。
第一种情况是使用类的实例进行常规函数调用,第二种情况是调用静态函数。
静态应该小心使用,经常使用它往往是重构/重新设计的信号。
面向对象编程的目的是通过编写类(蓝图)来模拟世界,然后创建所需数量的独立类实例。每个实例都是具有类DNA的小生物体,您可以在每个单独的实例上调用相同的类方法,而不会影响其他实例。
然而,静态调用与类实例无关,因此没有使用对象。它是某些工具功能的全局调用,实际上违反了封装的思想。
因此,我并不是说没有静态类和方法的用例,但应该小心使用。

“静态应该谨慎使用,而且经常使用它是重构/重新设计必要的标志。”我喜欢这句话。 - kazinix
感谢您的深入解释。我在另一个回复中发布了一个问题,想知道在数据库类中,静态方法是否适合用于数据库连接函数。您有什么想法或理由吗? - DieselPower
在我看来没有意义。您希望能够创建多个句柄并将实例存储在注册表中或其他地方。 - markus

2

new是实例化类的关键字。如果你想使用一个没有类实例的方法,它应该是一个静态方法。要有一个静态方法,将方法声明为静态。

class foo
{
    public static function bar()
    {
        return 'hello!'; 
    }
}

如何使用它?

echo foo::bar(); //Will print hello

1
我认为你在那里漏掉了一个函数 - sberry
谢谢,我觉得这很有帮助。如果我想要创建一个连接到数据库的函数,我可能会将它作为静态方法来实现? - DieselPower

1
你可以将testfunc声明为静态函数,并像下面这样调用它:
class newclass{

  public static function testfunc{

     return '1';
  }
}

echo newclass::testfunc();

没有什么像这样的 echo testfunc->newclass();,并且像这样做

$class = new newclass();
echo $class->testfunc();

当方法是实例方法而不是静态方法时,这是正确的做法。注意,在静态方法中没有引用$this的能力。


0
您可以为构造函数创建一个静态包装器,从而允许在同一行上链接方法调用。
<?php

class ClassA {

     static function create() { return new self(); }

     function method1() { ... }

}


ClassA::create()->method1();

-2

你可以包含包含你的函数的 PHP 文件

<?php
//print.php
function printHello(){
echo "Hello world";
}
?>

然后将其包含并调用该函数...

<?php
include "print.php";
printHello();

?>

这绝对没有回答这里所问的问题。 - markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接