这就是我想要做的事情:
$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
}
Run Code Online (Sandbox Code Playgroud)
显然这不是我实际做的,但基本上我有一个类的未知名称,并根据名称,我想生成具有某些属性等的类.
我已经尝试过使用eval(),但它让我更适合私人和$ this->引用......
//编辑
好吧,很明显,我的短暂和甜蜜的"这就是我想做的事情"在那些可能提供答案的人中引起了巨大的冲突和惊愕.为了得到一个真正的答案,我会更详细.
我有一个验证框架,使用我维护的网站上的代码提示.每个函数都有两个定义
function DoSomething($param, $param2){
//code
}
function DoSomething_Validate(vInteger $param, vFloat $param2){
//return what to do if validation fails
}
Run Code Online (Sandbox Code Playgroud)
我想在我的数据库中为主键添加验证器.我不想为每个表创建一个单独的类(203).所以我的计划是做类似的事情
function DoSomething_Validate(vPrimaryKey_Products $id){ }
Run Code Online (Sandbox Code Playgroud)
__autoload将生成vPrimaryKey的子类并将table参数设置为Products.
现在开心?
我想知道是否有办法在运行时将新方法附加到类中.我的意思是,不是在实例级别而是直接到类,所以所有新创建的实例都有这个新方法.这样的事情可以用反射来完成吗?
谢谢
我想创建一个类型安全的通用日志装饰器。
我有许多存储库(接口),每个存储库都需要一个装饰器,以捕获它们可能抛出的异常,将其传递给LoggerInterface的实例,然后重新抛出它们。可以创建一个专用的装饰器并为每个装饰器进行测试,尽管这非常麻烦(尤其是很好地进行了测试),但我还是避免了。
使用__call创造一个更通用的装饰是,想到的第一种方法。但是,这将导致对象实例无法实现其装饰的存储库接口。在我的项目中,这是不可行的。有没有办法告诉PHP它确实实现了此接口,例如通过使用一些魔术反射?
我已经在stackoverflow上阅读了“ 如何在PHP中实现装饰器? ”和“ 在PHP 中实现用于方法结果缓存的装饰器模式的最佳方法 ”,它们都概述了专用方法和通用方法,尽管均未提供对方法的指示。以类型安全的方式执行通用方法。这些问题发布以来已经过去了一段时间,所以也许情况已经改变了。我正在使用PHP 7,并且可以根据需要使用PHP 7.1。
PHPUnit_MockObject允许通过与getMockPHPUnit中熟悉的方法调用的代码相同的代码构造实现接口的对象。这可以作为通用装饰器的基础。但是,这将需要在生产代码中使用模拟库。此外,该库在内部使用eval完成其工作。这使它不符合我的项目的资格。
该schmittjoh/CG-库看来我需要什么,但没有文件可言.
该库提供了生成PHP代码通常需要的一些工具.其中一个优势在于通过行为增强现有类.
鉴于A课程:
class A {}
Run Code Online (Sandbox Code Playgroud)
我想在运行时和一些缓存机制上修改类A,使其实现给定的接口:
interface I
{
public function mustImplement();
}
Run Code Online (Sandbox Code Playgroud)
......与方法"默认"的实现mustImplement()在A类.