如何在静态方法(php)中访问非静态方法

lc8prwob  于 2023-09-29  发布在  PHP
关注(0)|答案(5)|浏览(101)

我在处理遗留代码时发现了这个问题,在OrderService中有一个静态方法createOrder(),我想检查商店是否打开
我想做一个非静态的方法openingHours()来检查时间。
我可以为这个解决方案使用ReflactionClass吗?
当我在createOrder()中使用openingHours()时,会发生以下错误:
无法在非对象上下文中使用“$this”。intelephense(1030)
$this不能用于static methods.php
createOrder()方法:

public static function createOrder(array $data {
// some logic 
 
     $is_opening = $this->openingHours();

     if ($is_opening != true) {

        $msg = trans('stores.not_available');
        $data['fail_msg'] = $msg;
        return $data;
     }
}

openingHours()

public function openingHours($store){
      
    return 'hello';
 }
n3schb8v

n3schb8v1#

createOrder不能是静态的,或者openingHours也必须是静态的。除非你在CNODErOrder中有或创建了一个示例,你可以在这个示例上调用非静态方法openingHours,比如$store->openingHours()。

bksxznpy

bksxznpy2#

你能告诉我$store变量是什么意思吗?我猜它可能包含Store Model对象,所以我建议将openingHours()方法放在Store Model类中。

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class Store extends Model
{
    // ...
    public function isInOpeningHours(): bool // you can pass current timestamp or whatever you need to check this.
    {
        // ...
    }
}

比这更好的是,我建议在你的商店模型类中创建一个getter,以获得一个表单中的开放时间,这是很好的进行验证。

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class Store extends Model
{
    // ...
    public function getOpeningHours(): array
    {
        // ...
    }
}
camsedfj

camsedfj3#

考虑在非静态函数中转换 createOrder()
如果这不可行,唯一的方法是在静态函数中创建类的示例:

$is_opening = (new static)->openingHours();

或者,如果你需要依赖注入:

$is_opening = app (__CLASS__)->openingHours();
zsbz8rwp

zsbz8rwp4#

解决方法之一是调用类中不存在的方法,并使用__callStatic魔术方法来引用所需的方法。

Public function __callStatic($method, $args){
    if($method == "methodRefererToCreateOrderMethod"){
        $this->createOrder($args);
    }
}

然后这样叫

Order::methodRefererToCreateOrderMethod($args)

我希望能成功。

q5iwbnjs

q5iwbnjs5#

你可以在静态函数中创建一个新的对象来访问非静态函数,比如:

public static function createOrder(array $data {
 // some logic 

 $is_opening = (new self)->openingHours();

 if ($is_opening != true) {

    $msg = trans('stores.not_available');
    $data['fail_msg'] = $msg;
    return $data;
 }

}
我希望这对你有帮助,如果有问题,演示更多

相关问题