- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Yii框架核心组件类实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了yii框架核心组件类。分享给大家供大家参考,具体如下:
ccomponent类为yii框架的基于组件和事件驱动编程提供了基础,yii框架中的大部分类都将ccomponent类作为基类.
ccomponent类为它的子类提供3个特性:
1、成员变量扩展 。
通过定义两个成员函数(getxxx/setxxx)来定义一个成员变量,比如:
1
2
|
public
function
gettext
() {…}
public
function
settext {…}
|
这样就相当于定义了一个$text成员变量,可以这样调用 。
1
2
3
|
$a
=
new
ccomponent;
$a
=
$component
->text;
// 等价于$a=$component->gettext();
$component
->text=
'abc'
;
// 等价于$component->settext(‘abc');
|
ccomponent是通过魔术方法__get和__set来实现“成员变量扩展”特性的,如果对类本身不存在的成员变量进行操作时,php会调用这个类 的__get和__set方法来进行处理。ccomponent利用这两个魔术方法实现了“成员变量扩展”特性。下图描述了一个ccomponent的子 类,它增加了active和sessionname两个成员变量,该图描述了对于这两个成员变量的调用流程.
面向对象编程中直接定义一个成员变量就可以了,为什么ccomponent要通过定义2个函数来实现一个成员变量呢?一个主要得原因是需要对成员变 量进行“延时加载”,一般情况下类的成员变量是在构造函数或者初始化函数进行统一赋值,但是在一次web请求的处理过程中不是每个成员变量都会被使用,比 如app类中定义了两个成员变量:$cache和$db($cache是一个缓存对象,$db是一个数据库链接对象),这两个对象在app类初始化的时候 创建,但是一个web网站的有些页面,它内容可以通过缓存获取,那么数据库链接对象其实就不需要创建。如果将app定义为ccomponent的子类,在 app类中定义两个方法:getcache/getdb,这样就可以做到第一次使用db成员变量的时候,才调用getdb函数来进行数据库链接的初始化, 从而实现延时加载——即在第一次使用时进行初始化。虽然延时加载会增加一次函数调用,但是可以减少不必要的成员变量的初始化(总体上其实是提升了网站的访 问速度),而且可以使得我们的代码更加易维护、易扩展.
延时加载应该是“成员变量扩展”特性的最重要的用途,当然这个特性还会有其它用途,想一想,当你操作一个成员变量的时候,你其实是在调用getxxx和setxxx成员函数,你是在调用一段代码! 。
2、事件模型 。
事件模型就是设计模式中的“观察者模式”:当对象的状态发生了变化,那么这个对象可以将该事件通知其它对象.
为了使用事件模型,需要实现这三个步骤:1、定义事件;2、注册事件句柄;3、触发事件。 ccomponent的子类通过定义一个以on打头的成员函数来定义一个事件,比如:public function onclick(){…},接着通过调用attacheventhandler成员函数来注册事件句柄(可以注册多个事件句柄),最后通过调用 raiseevent来触发事件.
ccomponent类使用一个私有的成员变量来保存事件以及处理该事件的所有句柄,该成员变量可以看作一个hash表,hash表的key是事件的名称,hash表的value是事件处理函数链表.
3、行为类绑定 。
有两种办法可以对类添加特性:1、直接修改这个类的代码,添加一些成员函数和成员变量;2、派生,通过子类来扩展。很明显第二种方法更加易维护、易扩展。如果需要对一个类添加多个特性(多人在不同时期),那么需要进行多级派生,这显然加大了维护成本.
ccomponent使用一种特殊的方式对类信息扩展——行为类绑定。行为类是一个cbehavior的子类,ccomponent可以将一个或者多个 cbehavior类的成员函数和成员变量添加到自己身上,并且在不需要的时候卸载掉某些cbehavior类。下面是一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
12
|
//计算器类
class
calculator
extends
cbehavior
{
public
function
add(
$x
,
$y
) {
return
$x
+
$y
; }
public
function
sub(
$x
,
$y
) {
return
$x
–
$y
; }
…
}
$comp
=
new
ccomponent();
//为我的类添加计算器功能
$comp
->attachbehavior(‘calculator',
new
calculator());
$comp
->add(2, 5);
$comp
->sub(2, 5);
|
ccomponent通过__get、__set和__call这3个魔术方法来实现“行为类绑定”这个特性,当调用ccomponent类不存在的成员 变量和成员方法的时候,ccomponent类会通过这三个魔法方法在“动态绑定的行为对象”上进行查找。即将不存在的成员变量和成员方法路由到“动态绑 定对象”上.
可以用3句话来总结ccomponent类的特性:
1、 更好的配置一个对象,当设置对象的成员变量的时候,其实是运行一段代码; 2、 更好的监听一个对象,当对象的内部状态发生变化的时候,其它对象可以得到通知; 3、 更好的扩展一个对象,可以给一个对象增加成员变量和成员函数,还能监听这个对象的状态.
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助.
原文链接:https://blog.csdn.net/ltx06/article/details/52330772 。
最后此篇关于Yii框架核心组件类实例详解的文章就讲到这里了,如果你想了解更多关于Yii框架核心组件类实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Linux 有许多跨(假设是 2 个)CPU 内核执行的线程和进程。我希望我的单线程 C/C++ 应用程序成为 CPU0 上的唯一线程。我如何“移动”所有其他线程以使用 CPU1? 我知道我可以使用
我有一个类似于下图的数据库表 Table with 2 columns (UserId and value) 我将传递 UserId 和 2 个字符串。例如:userId: 1, key1: h1,
我想在我的新项目中使用 ASP.NET Core,因为我听说它更快。但是,该项目将使用广泛的数据库访问功能,Entity Framework Core 不支持其中一些功能。我想知道,是否可以使用 En
我已经使用 EntityFrameworkCore.SqlServer 2.0 开发了 asp .net core wep api 2.0 应用程序。它是使用数据库优先方法开发的。当尝试使用 dbco
我已经阅读了很多关于这个主题的文章,但我仍然无法处理这个问题。对不起,如果它是重复的,无论如何! 所以基本上,我正在从头开始构建一个 Angular 应用程序,并且我想按照最佳约定来组织我的代码。我有
我对MPI还是陌生的,所以如果这是一个琐碎的问题,请原谅我。我有一个四核CPU。我想运行一个在单个内核上使用两个进程的OpenMPI C++程序。有什么办法吗?如果是这样,那又如何?我提到了this
下面是一个传播异常处理机制的类问题,所需的输出是异常。任何人都可以解释为什么输出是异常,在此先感谢。 Class Question { public void m1() throws Excep
我想打印每个获得 CPU 时间片的进程的 name 和 pid。可能吗? 最佳答案 对于单个流程,您可以在以下位置获取此信息: /proc//stat 第14和第15个字段分别代表在用户态和内核态花费
我想知道是否可以识别具有特定 thread-id 的线程使用的物理处理器(核心)? 例如,我有一个多线程应用程序,它有两 (2) 个线程(例如,thread-id = 10 和 thread-id =
我有一个需要身份验证的 Solr 核心。假设我有一个用户,密码为password。当我现在尝试在控制台中创建一个 Solr 核心时 bin\solr create -c test 我收到 HTTP 错
我想为与使用它的项目不同的类库中的第二个和后续数据库创建迁移。有皱纹。我永远不会知道连接字符串,直到用户登录并且我可以从目录数据库 (saas) 中获取它。 对于目录数据库,我使用了来自 this 的
我想为一种可以产生 GHC Core 的简单语言创建一个前端。然后我想获取这个输出并通过正常的 GHC 管道运行它。根据this page , 不能直接通过 ghc 命令实现。我想知道是否有任何方法可
阅读文档,我构建了 2 个使用 BLE 连接 2 个 iDevices 的应用程序。 一个设备是中央设备,另一个是外围设备。 Central在寻找Peripheral,当找到它时,探索它的服务和特性,
在我的网络应用程序中,我对长时间运行的任务进行了操作,我想在后台调用此任务。因此,根据文档 .net core 3.1 Queued background tasks我为此使用这样的代码: publi
Solr 1.4 Enterprise Search Server 建议对核心副本进行大量更新,然后将其换成主核心。我正在按照以下步骤操作: 创建准备核心:http://localhost:8983/
它们是否存在,如果存在,文档和代码在哪里? 最佳答案 它们位于 Git 的 test 目录中。 https://github.com/jquery/jquery/tree/master/test 关于
我有一个 Lisp (SBCL 1.0.40.0.debian) 应用程序 (myfitnessdata),它使用以下代码来处理命令行参数: (:use :common-lisp) (:export
Core是GHC的中间语言。阅读Core可以帮助你更好地了解程序的性能。有人向我索要有关阅读 Core 的文档或教程,但我找不到太多。 有哪些文档可用于阅读 GHC Core? 这是我迄今为止发现的内
我有一个核心 WebJob 部署到 Azure Web 应用程序中。我正在使用WebJobs version 3.0.6 . 我注意到,WebJob 代码不会立即拾取对连接字符串和应用程序设置的更改(
我有一个在内部构造和使用 SqlConnection 类的第三方库。我可以从该类继承,但它有大量重载,到目前为止我一直无法找到合适的重载。我想要的是将参数附加到正在使用的连接字符串。 有没有办法在 .
我是一名优秀的程序员,十分优秀!