【问题标题】:PHP Call Function in a Class - Is there a simpler way?类中的 PHP 调用函数 - 有没有更简单的方法?
【发布时间】:2011-10-07 05:39:30
【问题描述】:

我对 OOP 很陌生,对 PHP 很生疏。我想知道这是否是从类中调用函数的有效方法?

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

我可以这样称呼它吗:

echo testfunc->newclass();

或者像这样:

echo newclass()::testfunc;

我总是看到它在下面的示例中定义,它似乎是额外的代码?:

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

任何帮助都将不胜感激,因为我刚刚开始思考这个 OOP 问题。如果我出去吃午饭,也许有人可以建议一个链接,指向一个非常好的指南,供真正的课程/OOP 初学者使用。谢谢!

【问题讨论】:

标签: php oop class function


【解决方案1】:

这两种方式都有效,都有各自的用例。

您的第一种情况是使用类实例的常规函数​​调用,第二种情况是对静态函数的调用。

应谨慎使用静态,使用它通常表明需要重构/重新设计。

面向对象编程的重点是通过编写类(蓝图)来对世界建模,然后根据需要使用 new 一词创建该类的尽可能多的独立实例。每个实例都是一个带有类 DNA 的小有机体,您可以在每个实例上调用相同的类方法,而不会影响其他实例。

然而,静态调用与类的实例无关,因此没有使用对象。这是对某些工具功能的全局调用,实际上打破了封装的想法。

所以,我并不是说静态类和方法没有用例,但应该谨慎使用它们。

【讨论】:

  • “静态应该小心使用,它的使用通常表明重构/重新设计是必要的”我喜欢这句话。
  • 感谢您的深入解释。我确实在另一个回复中发布了一个问题,想知道静态方法是否适用于 db 类中的数据库连接函数。你的想法/理由是什么?
  • 海事组织没有意义。您希望能够创建多个句柄并将实例存储在注册表中。
【解决方案2】:

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

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

怎么用?

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

【讨论】:

  • 我认为您在某处缺少function
  • 谢谢,我发现这很有帮助。如果我要说创建一个具有连接到数据库的函数的数据库类。我可能会将其设为静态方法?
【解决方案3】:

您可以将testfunc 设为静态并这样称呼它:

class newclass{

  public static function testfunc{

     return '1';
  }
}

echo newclass::testfunc();

没有像 echo testfunc->newclass(); 这样的事情,而且这样做

$class = new newclass();
echo $class->testfunc();
当方法是实例方法而不是静态方法时,

是正确的方法。 注意,在静态方法中无法引用$this

【讨论】:

    【解决方案4】:

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

    <?php
    
    class ClassA {
    
         static function create() { return new self(); }
    
         function method1() { ... }
    
    }
    
    
    ClassA::create()->method1();
    

    【讨论】:

      【解决方案5】:

      您可以包含包含您的函数的 php 文件

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

      然后包含它并调用函数...

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

      【讨论】:

      • 这并不能回答这里提出的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多