【问题标题】:Laravel - How to call static function without instantiate objectLaravel - 如何在不实例化对象的情况下调用静态函数
【发布时间】:2016-11-18 08:50:43
【问题描述】:

Laravel (5.2) 中是否有任何方法可以在自定义对象中调用静态和/或非静态函数,而不必在使用它的所有类中实例化引用对象?

示例:我有类 App\Helpers\Utilities.php 和公共函数 doBeforeTask()

我在我的项目中使用这种方法来分配类,如果我可以直接调用 Utilities::doBeforeTask()Utilities->doBeforeTask() 而不创建我的 Utilities 对象 $obj = new Utilities(); 的实例,那就太好了

【问题讨论】:

  • 不会将其重命名为 public static function doBeforeTask() 完全满足您的需要吗?

标签: php laravel oop model-view-controller web


【解决方案1】:

将您的方法定义为静态方法。并使用以下代码在任何地方调用它:

Utilities::doBeforeTask();

文件的代码结构App\Helpers\Utilities.php

namespace App\Library;

class Utilities {

 //added new user
 public static function doBeforeTask() {
  // ... you business logic.
 }
}

【讨论】:

    【解决方案2】:

    将您的方法定义为静态方法。并在任何地方调用它

    举个例子

     namespace App\Http\Utility;
    
        class ClassName{
    
            public static function methodName(){
             // ... you business logic.
            }
        }
    

    你想在哪里使用指定命名空间

    像这样:

    use App\Http\Utility\ClassName;
    
    ClassName::methodName();
    

    别忘了跑

    composer dump-autoload
    

    【讨论】:

      【解决方案3】:

      如果它是您无法更改为静态的方法(即它是供应商文件),那么您可以在 PHP >= 5.4 中执行此操作

      $something = (new Something)->foo("bar"); 
      

      【讨论】:

        【解决方案4】:

        定义静态函数

        class Foo
        {
        
            public static function staticFunction() {
                return 'Hello World';
            }
        }
        

        现在调用 Foo::staticFunction()

        【讨论】:

        • 但它不需要在 composer.json 中进行某种自动加载或实现,例如服务提供者或别名?
        • 如果你想在任何地方使用它,你可以在自动加载中要求它或在作曲家中将其添加为 dep
        • 不确定是否应该创建它,但 Laravel 6 中没有 app/helpers 文件夹。
        • @boomdrak,在这种情况下不是,因为它是简单的普通 PHP 实现。自动加载所需的当然是符合 psr-4 的命名空间。你想到的是 Laravel 的 Facade。
        【解决方案5】:

        Laravel 也有一个 Facade 实现,这可能是 TS 的想法。这些 Facades 基本上可以为您做所有事情,而且很可能还解决了“供应商文件”问题。

        https://www.larashout.com/creating-custom-facades-in-laravel

        基本上你必须提供它的一个实例并将你的外观指向它,这反过来又会得到你注册的别名。一切都在上面的网址中进行了解释。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-15
          • 2011-10-17
          • 2020-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          相关资源
          最近更新 更多