如何创建一个将消息推送到用户特定帐户的通知系统?

Hen*_*c17 -1 php

我正在尝试将函数存储在文件中并在需要时提取以运行,但我找不到更好的方法来执行此操作。

这是我尝试过的:

function store_callable(string $func)
{
    writefile($func);
}
eval(readfile());
Run Code Online (Sandbox Code Playgroud)

我首先关心的是参数的类型$func。我期望仅接收callable作为参数,但我找不到将 PHP 可调用转换为字符串以保存的方法。

其次,虽然eval()这里使用 来运行保存的函数,但我想知道是否有更好的方法来做到这一点,尽管似乎没有。

我不认为这是一种序列化,但它们似乎有相似之处,所以我仍然添加了标签。


编辑:

我最初的想法是创建一个通知系统,将消息推送到用户的特定帐户。但是,某些通知仅专门推送到一台设备或 IP。这意味着我需要一个过滤功能。我实际上可以通过使用像这样的新属性来完成此操作,restricted-to但我想filter-function在通知对象中创建一个更通用的字段,该字段返回一个布尔值,并让系统决定是否在此负载上推送通知。

编辑2:

我实际上可以直接将它们编码在PHP文件中,但这会变得混乱,因为不同的通知有不同的过滤器来决定是否推送它们,我可以给你一个例子:

new Notification("message");
class Notification
{
    public function push_or_not()
    {
        if($this->isabout== "login" && checkIP())
        {
            \\ sth
        }
        else if() 
        else if()
        //and so on
    }
}
Run Code Online (Sandbox Code Playgroud)

这样实际上可以运行并避免安全风险。但这还不够普遍。这意味着我需要if-else首先编辑此处,并type在此处创建一个新属性。

我只是问直接存储在通知数据中的初始更通用的过滤器函数(因为我可以在每个通知中定义它,但在这里我可以添加类型并将其与类型相关联)是否更好(以及任何改进)或这里的后一个更好。

这里似乎没有太大的安全风险,因为这里的代码与用户输入无关。

ADy*_*son 5

您实际上根本不需要动态代码。

使该功能更简洁、更易于维护和测试以及消除与使用相关的任何潜在安全风险的一种方法eval()可能是使每个通知类型成为该类的子类Notification,并具有自己的push_or_not()函数定义重写父类的定义,因此每种类型的逻辑都是单独保存和实现的。

一个非常简单的例子:

abstract class Notification {
    abstract public function push_or_not();
}

class Notification_Login extends Notification
{
    public function push_or_not() {
        if (checkIP() && "Something") {
            return true;
        }
        else return false;        
    }
}

class Notification_SomethingElse extends Notification
{
    public function push_or_not() {
        if (checkIP() && "SomethingElse") {
            return true;
        }
        else return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,类有点像您在实际运行代码之前预先声明的模板,然后您可以在运行时根据需要创建它的任意多个副本(“实例”)。然后,您创建的实例都可以具有不同的数据值,但共享相同的代码逻辑。因此,您最终会为每种类型的通知创建一个类,然后您的代码可以根据需要创建该类的任意数量的实例,即为该类型的每个单独通知创建一个实例。