THINKPHP如何能让一个类中的所有方法在执行前都先执行一个验证方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了THINKPHP如何能让一个类中的所有方法在执行前都先执行一个验证方法相关的知识,希望对你有一定的参考价值。

首先在你的方法类中写一个public function _initialize这个方法 在这个方法里面调用你的验证方法 这样在这个类里面所有方法执行前都会先执行一遍这个方法 如果在别的类里面的方法执行前也要执行这个验证方法 那就别的类继承这个类 然后就可以了 参考技术A 这不就是问的构造函数么
thinkphp的是

class IndexController extends Controller
function __initialize()
echo "总是会被运行";




可以百度下thinkphp的__initialize()和__construct()的区别
参考技术B 如果是简单的话,你可以先写一个类,在这个类中执行一些验证方法,然后让你所执行的类到继承于这个类就可以了。

其实,你说的在thinkphp中正好有一个更加符合你要求的例子
叫做RBAC,也就是权限控制管理
你可以在官网上下到之例子,在Example文件下有,即:RBAC

至于具体的使用方法,推荐你看一下这可视频,讲的很详细,一步一步来,就可以了!!
http://www.tudou.com/programs/view/YyfoP5pzdBo/追问

rbac我知道 但用在这里太大材小用了, 我就想知道他的原理

追答

他的原理主要是,写一个基类CommonAction.class.php,然后让所用要验证的类都继承它,从而就在执行其他类的是后完成了自动验证。

追问

我就是想知道这里面具体的原理啊
为什么继承了他就会先自动执行一次_initialize方法...

追答

这就是面向对象的规则,特殊就特殊在函数名是_initialize()
它就相当于C++里面的类的初始函数base(),是在类创建时自动执行的,
继承之后,当然自动执行他了。
也就是说,_initialize()换成别的函数名就不行了

追问

c++里面类的初始函数?
类创建时自动执行?
面向对象有这些东西吗
我说清楚点吧 就是说我写个类 叫PublicAction,里面有个方法叫validate(), 如何让这个类的其他方法和子类的其他方法 在执行前都自动执行这个validate方法. 如何实现

追答

_initialize()换成别的函数名就不行了

追问

thinkphp框架规定这个名字 换了当然不行, 但如果我自己规定一个不就行了?
...算了吧 我去读读源代码

追答

都跟你说了,肯定不行呀!这是php的语法规则。你看源代码能看到,那就真是见了鬼了

追问

...php语法规则里面可没这个
这函数是人定义的
参考ThinkPHP.Lib.Think.Core.Action.class.php的39行至46行
public function __construct()

//实例化视图类
$this->view = Think::instance('View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();

追答

好吧,不过我也没说错吧,构造函数

追问

还好吧 直接用initialize搞定了

本回答被提问者采纳
参考技术C 可以试试_initialize,或者单独写一个验证的控制,然后让需要验证的控制器继承那个单独写的验证控制器

如何从 QT(C++)中的子进程联系父进程以执行类中的方法?

【中文标题】如何从 QT(C++)中的子进程联系父进程以执行类中的方法?【英文标题】:How to contact parent process from child in QT (C++) to perfom method from class? 【发布时间】:2011-03-17 10:05:58 【问题描述】:

我有一个问题。我目前正在使用 QT (C++) 编写程序,但我遇到了这个问题。如果我选中复选框,它会启动一个方法,在哪里实现 fork()。父进程继续到最后(保持解冻的 GUI)。子进程在无限循环中工作。完成一个序列后,我将必要的数据存储到共享内存中。现在我需要联系父进程从共享内存中读取数据并在 GUI 上打印。我尝试了信号、管道、信号量……我的问题是……我需要联系父进程,我需要让他进入课堂,这是一种打印 GUI 输出的方法。如果我使用信号处理程序,就没有机会回到班级(我需要共享内存的 ID 才能连接)。我希望我的问题可以理解。我需要找到一个解决方案,在那里我可以联系父进程(例如 QT 中的 connect() )并从类中调用必要的方法。

【问题讨论】:

【参考方案1】:

您可以使用消息 (mq man pages),也可以进行投票。如果设置了共享内存中特定偏移量的值,则表示子进程结束,共享内存中的数据准备就绪。

【讨论】:

【参考方案2】:

我可能解决这个问题的方法是让 GUI 在主线程中运行,然后在选中复选框时启动 QThread。此 QThread 可以根据需要连续运行,也可以通过复选框停止和重新启动。

处理完成后,如果数据量很小,可以使用thread-safe signal 将数据传输到 GUI 线程,并且 GUI 线程上的插槽可以更新显示。如果有很多数据(正如您在问题中暗示的那样),请使共享内存对两者都可用(通过将其放在单独的模块中或使用创建 QThread 对象时创建的指针)并保护对共享QMutex 的内存。这个 QMutex 可以在 GUI 线程中创建,然后在创建时传递给工作线程。当数据准备好进行处理时,可以从工作线程向 GUI 线程发送线程安全信号,并且 GUI 线程中的插槽可以锁定(或 tryLock)QMutex,从共享内存中获取数据,然后解锁QMutex(并且可能会向工作线程发送一个信号以告诉它继续)。

【讨论】:

非常感谢!我像你写的那样更改了我的代码(实现 QThread 而不是 fork)。一切正常!真的再感谢一次!

以上是关于THINKPHP如何能让一个类中的所有方法在执行前都先执行一个验证方法的主要内容,如果未能解决你的问题,请参考以下文章

thinkPHP 如何在类中定义常量

springMVC框架如何根据页面上的访问路径快速找到相应的控制器类中处理请求的方法?

Unittest中TestCase类中定义的几个特殊方法

如何在 Java 类中找到使用特定方法的所有执行路径?

如何使静态类中的所有方法在c#中的另一个静态类中可用

在 Perl/Moose 中,如何将修饰符应用于所有子类中的方法?