Laravel - 如何在不实例化对象的情况下调用静态函数

问题描述 投票:0回答:6

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

示例:我有一个具有公共功能的课程

App\Helpers\Utilities.php
doBeforeTask()

我在项目中的很多类中使用此方法,如果我可以调用

Utilities::doBeforeTask()
Utilities->doBeforeTask()
而无需创建我的 Utilities 对象的实例
$obj = new Utilities();

,那就太好了
php laravel oop model-view-controller web
6个回答
20
投票

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

Utilities::doBeforeTask();

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

namespace App\Library;

class Utilities {

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

6
投票

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

举个例子吧

 namespace App\Http\Utility;

    class ClassName{

        public static function methodName(){
         // ... you business logic.
        }
    }

您要使用的地方指定命名空间

像这样:

use App\Http\Utility\ClassName;

ClassName::methodName();

别忘了奔跑

composer dump-autoload

2
投票

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

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

1
投票

定义静态函数

class Foo
{

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

现在调用 Foo::staticFunction()


1
投票

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

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

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


1
投票

对于动态静态调用

Utilities::anyMethod($args);

PHP 代码

<?php
namespace App\Library;

class Utilities {
  public function anyMethod() {
     // simple code
  }

  public static function __callStatic($method, $args)
  {
      $instance = static::resolveFacadeInstance(static::getFacadeAccessor());
      switch (count($args))
      {
        case 0:
            return $instance->$method();

        case 1:
            return $instance->$method($args[0]);

        case 2:
            return $instance->$method($args[0], $args[1]);

        case 3:
            return $instance->$method($args[0], $args[1], $args[2]);

        case 4:
            return $instance->$method($args[0], $args[1], $args[2], $args[3]);

        default:
            return call_user_func_array(array($instance, $method), $args);
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.