首页 > 解决方案 > 如何/在哪里在 PHP 中两次声明一个静态函数?

问题描述

我在 Symfony 中有两个课程:

<?php
namespace App\MiniEntities;

class Address {
    // ...

    static function load(Redis $r, string $address) {
        return jsonOrFalseFromRedis($r, "addr:" . $address);
    }
}

<?php
namespace App\MiniEntities;

class Name {
    // ...

    static function load(Redis $r, string $address) {
        return jsonOrFalseFromRedis($r, "addr:" . $address);
    }
}

他们都使用jsonOrFalseFromRedis功能。

我知道我可以做一个父类并将函数放在那里,但是我想将它保留为正常函数。

但是我不能这样做,目前我用静态方法做了另一个类似 Java 的类jsonOrFalseFromRedis

到目前为止我尝试了什么:

我做了一个名为 help.php 的文件并做了require_once "help.php";,但是它给了我以下错误:

Compile Error: Cannot redeclare App\MiniEntities\jsonOrFalseFromRedis() (previously declared in /www/sites/btc_pay/src/MiniEntities/help.php:9)

更新

我是这样做的:

姓名:

<?php
namespace App\MiniEntities;

class Name {
    // ...

    static function load(Redis $r, string $address) {
        return jsonOrFalseFromRedis($r, "addr:" . $address);
    }
}

require_once "help.php";

帮助.php:

<?php

namespace App\MiniEntities;


function jsonOrFalseFromRedis(Redis $r, $key) {
    $json = $r->get($key);

    if ($json)
        return json_decode($json, true);

    return false;
}

标签: php

解决方案


使用静态方法或过程函数是违反 OOP 模式的。

您应该在 services.yml 中将帮助程序和其他类定义为服务

App\MiniEntities\Helper:
    class: 'App\MiniEntities\Helper'

App\MiniEntities\Address:
    class: 'App\MiniEntities\Address'
    arguments: 
        $helper: '@App\MiniEntities\Helper'

然后使用 DI 将你的助手注入到类中

class Address 
{
    private $helper;

    public function __construct(Helper $helper)
    {
        $this->helper = $helper;
    }

    public function load(Redis $r, string $address) 
    {
        return $this->helper->jsonOrFalseFromRedis($r, "addr:" . $address);
    }
}

推荐阅读