gpt4 book ai didi

php - 在运行时在php中动态生成类?

转载 作者:IT王子 更新时间:2023-10-29 01:16:29 26 4
gpt4 key购买 nike

这是我想做的:

$clsName = substr(md5(rand()),0,10); //generate a random name
$cls = new $clsName(); //create a new instance

function __autoload($class_name)
{
//define that instance dynamically
}

显然这不是我实际在做的,但基本上我有一个类的未知名称,并且基于名称,我想生成具有某些属性等的类。

我试过使用 eval() 但它让我对私有(private)和 $this-> 引用不满意...

//编辑

好吧,显然我简短而甜蜜的“这就是我想做的”在那些可能能够提供答案的人中引起了巨大的冲突和惊愕。为了得到实际答案,我会更详细一些。

我在我维护的网站上有一个使用代码提示的验证框架。每个函数都有两个定义

function DoSomething($param, $param2){
//code
}
function DoSomething_Validate(vInteger $param, vFloat $param2){
//return what to do if validation fails
}

我想为我的数据库中的主键添加一个验证器。我不想为每个表 (203) 创建一个单独的类。所以我的计划是做类似的事情

function DoSomething_Validate(vPrimaryKey_Products $id){ }

__autoload 将生成 vPrimaryKey 的子类并将表参数设置为 Products。

现在开心吗?

最佳答案

从 PHP 7.0 开始,只要有一点创造力和对一些鲜为人知的 PHP 特性的了解,您完全可以做到这一点,而无需求助于 eval 或动态创建脚本文件。您只需要使用 anonymous classesclass_alias (),像这样:

spl_autoload_register(function ($unfoundClassName) {
{
$newClass = new class{}; //create an anonymous class
$newClassName = get_class($newClass); //get the name PHP assigns the anonymous class
class_alias($newClassName, $unfoundClassName); //alias the anonymous class with your class name
}

这是可行的,因为匿名类仍然在幕后分配了一个名称并放在全局范围内,因此您可以自由地获取该类名称并为其设置别名。查看上面匿名类链接下的第二条评论以获取更多信息。

话虽如此,我觉得这个问题中的所有人都在说“Eval 总是一个非常糟糕的主意。永远不要使用它!”只是重复他们从 hive 头脑中听到的内容,而不是自己思考。 Eval 在语言中是有原因的,并且在某些情况下可以有效地使用它。如果您使用的是旧版本的 PHP,这里 eval 可能是一个很好的解决方案。

然而,它们是正确的,因为它可以打开非常大的安全漏洞,你必须小心你如何使用它和了解如何消除风险。重要的是,就像 SQL 注入(inject)一样,您必须清理您在 eval 语句中输入的任何输入。

例如,如果您的自动加载器看起来像这样:

spl_autoload_register(function ($unfoundClassName) {
{
eval("class $unfoundClassName {}");
}

黑客可以这样做:

$injectionCode = "bogusClass1{} /*insert malicious code to run on the server here */ bogusClass2";

new $injectionCode();

看看这有可能成为安全漏洞吗? 任何黑客放在两个假类名之间的东西都将通过 eval 语句在你的服务器上运行。

如果您调整自动加载器以检查传入的类名(即执行 preg_match 以确保没有空格或特殊字符,将其与可接受的名称列表进行检查等),您可以消除这些风险,然后eval 在这种情况下使用可能完全没问题。如果你使用的是 PHP 7 或更高版本,我推荐上面的匿名类别名方法。

关于php - 在运行时在php中动态生成类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com