在php yii框架架中 0'=>是什么意思

Yii框架自带缓存的使用方法 - 心心的技术生活 - ITeye技术网站
博客分类:
Yii的自带缓存都继承CCache 类, 在使用上基本没有区别
缓存基础类 CCache 提供了两个最常用的方法:set() 和 get()。
要在缓存中存储变量 $value,我们选择一个唯一 ID 并调用 set() 来存储它:
Yii::app()-&cache-&set($id, $value);
被缓存的数据会一直保留在缓存中,直到因一些缓存策略而被删除(比如缓存空间满了,删除最旧的数据)。要改变这一行为,我们还可以在调用 set() 时加一个过期参数,这样数据过一段时间就会自动从缓存中清除。
// 在缓存中保留该值最多 30 秒
Yii::app()-&cache-&set($id, $value, 30);
当我们稍后需要访问该变量时(不管是不是同一 Web 请求),我们调用 get() (传入 ID)来从缓存中获取它。如果返回值为 false,说明该缓存不可用,需要我们重新生成它。
$value=Yii::app()-&cache-&get($id);
if($value===false)
// 因为在缓存中没找到,重新生成 $value
// 再缓存一下以备下次使用
// Yii::app()-&cache-&set($id,$value);
为一个要缓存的变量选择 ID 时,确保该 ID 在应用中是唯一的。不必保证 ID 在跨应用的情况下保证唯一,因为缓存组件有足够的智能来区分不同应用的缓存 ID。
要从缓存中删除一个缓存值,调用 delete();要清空所有缓存,调用 flush()。调用 flush() 时要非常小心,因为它会把其它应用的缓存也清空。
提示: 因为 CCache 实现了 ArrayAccess 接口,可以像数组一样使用缓存组件。例如:
$cache=Yii::app()-&
$cache['var1']=$value1;
// 相当于: $cache-&set('var1',$value1);
$value2=$cache['var2'];
// 相当于: $value2=$cache-&get('var2');
要使用这些缓存也很简单,只要服务器支持, 然后通进简单的修改配置文件即可使用
一. Memcache 的使用
1. 编辑配置文件config/main.php 添加memcache配置
'components'=&array(
'memcache'=&array(
'class'=&' system.caching.CMemCache',
'servers'=&array(
'host'=&'server1',
'port'=&11211,
'weight'=&60,
'host'=&'server2',
'port'=&11211,
'weight'=&40,
2. 在框架中的使用
Yii::app()-&memcache -&set($key, $value, $expire);
Yii::app()-&memcache -&get($key);
Yii::app()-&memcache -&deleteValue($key);
二. 数据库缓存的使用
1. 编辑配置文件config/main.php 添加dbcache配置
return array(
'components'=&array(
'dbcache'=&array(
'class'=&' system.caching.CDbCache',
'db'=&array(
'class'=&'system.db.CDbConnection',
'connectionString'=&'sqlite:/wwwroot/blog/protected/data/blog.db',
'schemaCachingDuration'=&3600,
2. 在框架中的使用
Yii::app()-&dbcache -&set($key, $value, $expire);
Yii::app()-&dbcache -&get($key);
三. 文件缓存的使用
1. 编辑配置文件config/main.php 添加dbcache配置
// application components
'components'=&array(
'filecache'=&array(
'class'=&'system.caching.CFileCache',
//我们使用CFileCache实现缓存,缓存文件存放在runtime文件夹中
'directoryLevel'=&'2',
//缓存文件的目录深度
2. 在框架中的使用
Yii::app()-&filecache -&set($key, $value, $expire);
Yii::app()-&filecache -&get($key);
编辑配置文件config/main.php 添加dbcache配置
'components'=&array(
'class' =& 'system.caching.CApcCache',
浏览 18309
浏览: 266138 次
来自: 上海
这技术太老了
参考 http://www.jb51.net/article/ ...
人才啊,还会安卓开发
hudeyong926 写道转载了还在搞magento,my第一章:认识Yii;认识Yii;在过去几年中,框架迅速发展,几乎在Web应用开发;Yii是创始人薛强的心血结晶,于;Yii的名称(是一个缩写,发音为Yee或[ji:;要运行基于Yii的Web应用,你需要它的核心框架;Yii集成了许多来自其他著名的Web程序框架和应;Yii还包含了一个易用的配置约定;Yii很高效;Yii是为开发任何规模的Web
第一章:认识Yii
在过去几年中,框架迅速发展,几乎在Web应用开发中,每个人都会涉及到一个新生框架,Web开发框架会帮助你加快你的应用程序发布,你只需迅速的把你的想法在框架的白板上书写功能代码。随着Web应用的实现具有共同特征,现有的框架方案已经满足这些要求,在今天还有什么理由要从头开始你的下一个Web应用呢?今天的Web开发,除程序自身语言外,一个现代化、灵活的和可扩展的框架,几乎是一个至关重要的编程工具,此外,如果语言与框架两个部份有特别的互补性,结果是将一个非常强大的工具包:Java和Spring, Ruby和Rails, C#和.NET, PHP和Yii。
Yii是创始人薛强的心血结晶,于日开始开发。在此这前,薛强开发和维护PRADO框架多年。这些年的经验和从PRADO项目得到的用户的反馈了解到,用户需要一个更容易、可扩展、更快速的基于PHP5的框架,以满足应用程序开发人员不断增长的需求。Yii正式发布于2008年10月,最初是alpha版本,其与其他基于PHP的框架表现相比令人印象深刻,立即引起非常积极的关注。在日Yii1.0正式发布, 并于日,发布最新版本1.1.2。它有一个不断增长的开发团队,并继续在每天PHP开发人员中得到收益。我们认为,在这本书中包含信息会对你有些帮助,你很快就会明白为什么。
Yii的名称(是一个缩写,发音为 Yee 或 [ji:])代表容易(easy),高效(effcient)和可扩展(extensible)。Yii是用PHP5写的一个高性能,基于组件的Web 开发应用框架。Yii可以更容易的创建和维护大规模的网络应用程序。这也将使应用程序更有效和可扩展。让我们快速了解一下这些特性。
要运行基于Yii的Web应用,你需要它的核心框架和一台支持PHP5.1.0以上的Web服务器,如果使用Yii开发,你需要精通PHP与面向对象编程 (OOP)。你不需要学习什么新的配置和模板语言,建立Yii应用,主要包括编写和维护自己定义的PHP类,其中一些将是继承Yii核心框架组件类。
Yii集成了许多来自其他著名的Web程序框架和应用程序中的伟大的想法,这些你可能会很熟悉并易于操作。
Yii还包含了一个易用的配置约定。这意味着,Yii已经为几乎所有的应用程序编写了合理的默认值,如果你按照约定的规范,你会写更少的代码,花更少的时间来开发应用程序。如果需要Yii允许你在这些约定基础之上进行定制,本章后面及整书,我们将覆盖到这些默认的约定。
Yii是为开发任何规模的Web应用提供的一个高性能的基于组件的Web框架,它鼓励在Web程序中最大化的代码重用,并可加快开发速度。如前所述,如果你坚持使用Yii的内置约定,你可以让您的应用在运行中,几乎不需要任何配置手册。
Yii的另一个目的是帮助你使用DRY开发,DRY(Don't Repeat Yourself)是一种灵活的应用开发。所有Yii应用是使用模型-视图-控制器(MVC)架构,Yii强制这种开发模式,通过提供一个放置你的MVC 代码的位置,这最大限度地减少重复,并有助于代码重用性和可维护性。你编写越少的代码,则需要的时间就越少,应用程序将赢得市场。同样,越容易维护你的应用程序,留在市场的时间就越长。
当然,Yii不仅开发快,他的运行速度也是非常快的,性能是经过优化的。Yii从一开始就已经做到了开发与性能优化,其结果是,他是一个最快的PHP开发框架。Yii的开发团队已经与其他PHP框架进行了对比与测试,Yii运行速度在他们之上。这意味着在Yii上编写应用程序增加额外的开销是微不足道的。
Yii是经过精心设计的,让几乎所有的代码都可扩展和可定制,以满足不同任务需要。事实上,在开发Yii的应用时,很难用不到Yii扩展性,这是一个很主要的行为,可扩展是框架的核心。如果你要将你的代码为作可重用的工具,提供给其他开发者使用,Yii提供了简单制作步骤和遵循准则,以帮助您建立这样的第三方扩展。并允许你将他贡献到Yii扩展列表中。
Yii最引人注目的是什么。易用性、性能优越、可扩展。Yii的功能包会帮助你满足今天在Web应用程序上的那些更高要求。AJAX可用挂件,Web Service包,基于MVC结构的验证,DAO和Active Record数据库层,复杂的缓存,分级的角色访问控制,主题化,国际化(I18N),和本地化(L10N),这仅仅是Yii的冰山一角。现在从1.1版本,核心框架中有一个官方扩展类库叫Zii。这些扩展是由框架的核心团队成员开发与维护。 社区用户也可以编写并贡献扩展,Yii的扩展每天都在增长,有关所有可用的用户贡献的扩展,详见/extensions/
如前所述,Yii是一个MVC框架,它提供了一个明确的目录结构,模型,视图,控制器的代码分别放到自己的目录,在我们建立第一个Yii应用之前,我们需要定义一些关键语,并查看Yii的MVC架构是如果实现和执行的。
通常在一个MVC架构中,模型是负责维护状态,因为,它应该封装业务规则,定义数据的状态。在Yii中,一个模型可以是 CModel的一个实例或它的子类。通常一个模型类包括数据的属性,可能还会有不同的标签(有些是为了显示给用户时更友好),并且可以设置一些规则进行验证。模型中的数据可能来自数据库的表或一个表单用户输入域。
Yii实现了两种模型:表单模型(CFormModel类)和Active Record模型(CActiveRecord类)。他们都继承自同一个基类CModel。CFormModel代表的数据模型是从HTML表单中收集的输入,它封装了所有逻辑,如表单的验证和其他业务逻辑,这些是要应用到表单的域上。它能将这些数据存储在内存中,或者在一个Active Record的模型帮助下,存入数据库。
Active Record (AR)是一种设计模式,用面向对象的方式抽象的访问数据。在Yii中,每一个AR对象的实例可以是CActiveRecord类或它的子类,它包装了数据库表或视图中的一行记录,并封装了所有逻辑
和访问数据库的细节,如果有大部份的业务逻辑,则必须使用这种模型。数据库表中一行每列字段的值对应AR对象的一个属性。关于AR的更多介绍,后面将详细说明。
通常情况下,视图是在数据模型的基础上渲染用户界面,Yii中一个视图就是一个PHP文件,它包含有关用户界面相关的元素,经常使用HTML,但也可以使用PHP语句。通常在视图中的PHP语句应该是非常简单的条件或循环语句,或者使用Yii的UI组件,比如HTML助手的方法或预先建立好的挂件。更复杂的逻辑应该与视图分离放到适当的模型中(如数据直接处理),或控制器中。
控制器主要是处理一个路由的请求,也负责获得用户的输入,与模型的交互,并指定视图的显示与更新。Yii中一个控制器实例可能是CController类或它的子类。当一个控制器运行时,它会执行一个请求的操作,然后与需要的模型交互,最后渲染到一个视图上。一个操作,最简单的形式就是一个控制器类方法,方法的名字要以action开头。
把MVC连接一起:Yii路由请求
大多数的MVC实现中,Web请求生命周期通常如下步骤:
1.浏览器发送请求到服务器上的MVC应用。
2.调用一个控制器用来处理请求。
3.这个控制器与模型交互
4.这个控制器调用视图
5.视图渲染数据(通常是HTML)并返回给浏览器显示
Yii 的MVC实现也不例外,在一个Yii应用程序中,从浏览器发送处理的请求,首先会传给一个路由。路由分析请求,并确定下一步的处理。在大多数情况下路由会识别控制器中的特定操作方法。这个操作方法将关注传入的请求数据与模型交互和执行其他需要的业务逻辑,最终,这个操作方法将处理的响应数据发送给他对应的视图类。视图将确认符合预期布局设计的数据,并返回到浏览器显示。
Blog执行例子
为了更好的理解,让我们看一个虚构的例子。假如我们用Yii建立了自己的一个博客网站,域名是
<。这个网站与典型的博客网站类似。在首页显示最近发布的文章列表。点击每篇文章的标题,可以显示完整的文章。下面的图片,可以说明Yii是怎样点击标题,发送请求的。
这个图片是跟踪到用户的点击连接:
/post/show/id/99
首先,请求发送给路由。路由解析请求URL结构中的关键词决定发送到哪。默认情况下,Yii的URL结构如以下格式:
http://hostname/index.php?r=ControllerID/ActionID
URL中的变量r指的是路由,Yii分析路由这条路由,以确定适当的控制器和操作方法做进一步处理请求。现在,你可能已经注意到,前面提到的URL地址并不遵循这个默认格式。其实这是一个非常简单的事情,通过配置来使用更友好的格式:
http://hostname/ControllerID/ActionID
这个例子我们将继续使用这行简化的格式。该URL中ControllerID指的是控制器的名称。默认情况下第一部份加上单词Controller就是控制器类的名称,例如:如果你的控制器类名是TestController则
ControllerID应该是Test。同样ActionID指的是控制器中定义的操作名称。如果要在控制器中定义操作,那么要将单词Action加上操作名称,例如:如果您的操作方法名为actionCreate(),那么 ActionID则是Create。
如果ActionID省略,控制器将采用默认的操作方法,这个方法是actionIndex()。如果ControllerID也省略了,应用程序将使用默认控制器。Yii默认的控制器是SiteController
回到这个例子,路由将分析下面的URL,/post/show/id/99,并会取URL路径的第一部份作为 ControllerID,第二部份作为ActionID。这将转化为路由请求到PostController类中的 actionShow()方法。URL最后部份(id/99)是一个键/值的查询参数,将在处理过程中,提供给操作方法。在这个例子中,表示所选的博客文章ID为99。
actionShow()方法处理具体的博客文章请求。在这种情况下,它使用查询字符串变量id,来确定具体的要求,他将要求模型来查询id=99的博客文章。
AR模型类请求数据库返回数据给控制器,控制器进一步准备数据给视图,视图则渲染到一个需要的HTML中,并将响应返回给用户的浏览器。
MVC架构允许我们将模型,控制器与视图分离,这使得开发人员可以很容易改变应用程序,而不影响用户界面(UI),UI设计师也可以自由作出不影响模型的业务逻辑变化。这种分离也可以很容易提供多个相同的模型。例如,你可以在的HTML页面或一个Flash/Flex RIA演示或移动应用程序或Web Service使用相同的模型代码,使用MVC约定的分离功能,将使应用程序更容易扩展和维护。
Yii已经帮你做了很多,并不是简单的分离代码,包括一些命令的约定和建议代码应该放置在同一类目录中。它已经帮助你写好了需要将这些部份关联在一起的代码。这使你可以享受严格的MVC设计带来的好处,而不必花费时间编写自己所需细节代码。让我们看看它都写了些什么。
对象关系映射和Active Record
在多数情况下,我们建立的Web应用程序内部会与数据库关联。如前面的博客发布程序,该程序中博客的文章内容存在数据库的表中。然而,Web应用程序需要的数据,与数据库映射到内存中类定义的属性是对应的。对象关系映射(ORM)库提供的,就是映射数据库表为一个对象的类。
ORM的大部份代码是如何实现数据库表中的字段与对象之间的关系,这是非常繁琐和重复的工作。幸运的是,Yii帮助你们完成了这些繁琐而又乏味的工作,它提供给我们一个ORM层,这就是AR模式。
Active Record
正如前面提到的,AR是一种设计模型,用面向对象的方式抽象的访问数据。它将表映射到类。行映射到对象,列则映射到对象的数据。换句话说,每一个 Active Reocrd类的实例代表了数据库表中的一行。然而,一个AR类不仅仅是数据库表中字段与类中属性的映射关系,他还需要在这些数据上处理一些业务逻辑。最终这个类定义了所有关于怎样对数据库的读写操作。
依靠约定和合理的默认值,Yii的AR对象将减少开发的时间,不必花费时间在繁琐和重复创建、读取、更新和删除数据的SQL语句上。它也允许开发人员使用面向对象的方式访问更多的数据库数据。为了说明这一点,在博客系统中的示例代码是用AR操作对应的数据库表中的id,id是表的主键,id等于99。首先它会检查主键,然后修改标题并将修改结果保存到数据库:
Active Record完成了我们以前需要编的任何SQL或其他要处理数据库的事情。
Active Reocrd不只做了这些。它还无缝的集成了许多Yii框架的其他方面。有许多表单输入域的HTML助手捆绑在AR类的属性上。这样,Active Record提取表单输入值时直接进入模型。并且它支持自动化数据验证,如果验证失败,Yii视图类会显示验证错误给最终用户。我们将在本书提供的许多具体例子再次介绍AR。
视图与控制器
视图和控制器是非常紧密的兄弟。控制器会生成需要显示的可用数据给视图,视图生成页面,并触发事件,发送数据给控制器。
包含各类专业文献、高等教育、幼儿教育、小学教育、专业论文、应用写作文书、文学作品欣赏、外语学习资料、生活休闲娱乐、02_第一章:认识Yii39等内容。 
 最核心的是 CComponent 类,了解 CComponent 的用途和设计思想是 认识 Yii...(2, $email); //第二列值绑定到$email //第一列值绑定到 //很赞的方法...  YiiPHP安装入门_计算机软件及应用_IT/计算机_专业资料。Yii框架的安装入门今日...第一章 安装检修基础 39页 免费 VS2010你入门了吗。看看... 18页 1下载券...网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&&>>&&>>&正文
深入讲解PHP的Yii框架中的属性(Property)
在 PHP 中,类的成员变量也被称为属性(properties)。它们是类定义的一部分,用来表现一个实例的状态(也就是区分类的不同实例)。在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。例如,如果有需求每次都要对 label 属性执行 trim 操作,就可以用以下代码实现:
$object-&label = trim($label);
上述代码的缺点是只要修改 label 属性就必须再次调用 trim() 函数。若将来需要用其它方式处理 label 属性,比如首字母大写,就不得不修改所有给 label 属性赋值的代码。这种代码的重复会导致 bug,这种实践显然需要尽可能避免。
为解决该问题,Yii 引入了一个名为 yii\base\Object 的基类,它支持基于类内的 getter 和 setter(读取器和设定器)方法来定义属性。如果某类需要支持这个特性,只需要继承 yii\base\Object 或其子类即可。
补充:几乎每个 Yii 框架的核心类都继承自 yii\base\Object 或其子类。这意味着只要在核心类中见到 getter 或 setter 方法,就可以像调用属性一样调用它。
getter 方法是名称以 get 开头的方法,而 setter 方法名以 set 开头。方法名中 get 或 set 后面的部分就定义了该属性的名字。如下面代码所示,getter 方法 getLabel() 和 setter 方法 setLabel() 操作的是 label 属性,:
namespace app\
use yii\base\O
class Foo extend Object
private $_
public function getLabel()
return $this-&_
public function setLabel($value)
$this-&_label = trim($value);
(详细解释:getter 和 setter 方法创建了一个名为 label 的属性,在这个例子里,它指向一个私有的内部属性 _label。)
getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是:当这种属性被读取时,对应的 getter 方法将被调用;而当属性被赋值时,对应的 setter 方法就调用。如:
// 等效于 $label = $object-&getLabel();
$label = $object-&
// 等效于 $object-&setLabel('abc');
$object-&label = 'abc';
只定义了 getter 没有 setter 的属性是只读属性。尝试赋值给这样的属性将导致 yii\base\InvalidCallException (无效调用)异常。类似的,只有 setter 方法而没有 getter 方法定义的属性是只写属性,尝试读取这种属性也会触发异常。使用只写属性的情况几乎没有。
通过 getter 和 setter 定义的属性也有一些特殊规则和限制:
这类属性的名字是不区分大小写的。如,$object-&label 和 $object-&Label 是同一个属性。因为 PHP 方法名是不区分大小写的。
如果此类属性名和类成员变量相同,以后者为准。例如,假设以上 Foo 类有个 label 成员变量,然后给 $object-&label = 'abc' 赋值,将赋给成员变量而不是 setter setLabel() 方法。
这类属性不支持可见性(访问限制)。定义属性的 getter 和 setter 方法是 public、protected 还是 private 对属性的可见性没有任何影响。
这类属性的 getter 和 setter 方法只能定义为非静态的,若定义为静态方法(static)则不会以相同方式处理。
回到开头提到的问题,与其处处要调用 trim() 函数,现在我们只需在 setter setLabel() 方法内调用一次。如果 label 首字母变成大写的新要求来了,我们只需要修改setLabel() 方法,而无须接触任何其它代码。
实现属性的步骤
我们知道,在读取和写入对象的一个不存在的成员变量时, __get() __set() 会被自动调用。 Yii正是利用这点,提供对属性的支持的。从上面的代码中,可以看出,如果访问一个对象的某个属性, Yii会调用名为 get属性名() 的函数。如, SomeObject-&Foo , 会自动调用 SomeObject-&getFoo() 。如果修改某一属性,会调用相应的setter函数。 如, SomeObject-&Foo = $someValue ,会自动调用 SomeObject-&setFoo($someValue) 。
因此,要实现属性,通常有三个步骤:
继承自 yii\base\Object 。
声明一个用于保存该属性的私有成员变量。
提供getter或setter函数,或两者都提供,用于访问、修改上面提到的私有成员变量。 如果只提供了getter,那么该属性为只读属性,只提供了setter,则为只写。
如下的Post类,实现了可读可写的属性title:
class Post extends yii\base\Object
// 第一步:继承自 yii\base\Object
private $_
// 第二步:声明一个私有成员变量
public function getTitle()
// 第三步:提供getter和setter
return $this-&_
public function setTitle($value)
$this-&_title = trim($value);
从理论上来讲,将 private $_title 写成 public $title ,也是可以实现对 $post-&title 的读写的。但这不是好的习惯,理由如下:
失去了类的封装性。 一般而言,成员变量对外不可见是比较好的编程习惯。 从这里你也许没看出来,但是假如有一天,你不想让用户修改标题了,你怎么改? 怎么确保代码中没有直接修改标题? 如果提供了setter,只要把setter删掉,那么一旦有没清理干净的对标题的写入,就会抛出异常。 而使用 public $title 的方法的话,你改成 private $title 可以排查写入的异常,但是读取的也被禁止了。
对于标题的写入,你想去掉空格。 使用setter的方法,只需要像上面的代码段一样在这个地方调用 trim() 就可以了。 但如果使用 public $title 的方法,那么毫无疑问,每个写入语句都要调用 trim() 。 你能保证没有一处遗漏?
因此,使用 public $title 只是一时之快,看起来简单,但今后的修改是个麻烦事。 简直可以说是恶梦。这就是软件工程的意义所在,通过一定的方法,使代码易于维护、便于修改。 一时看着好像没必要,但实际上吃过亏的朋友或者被客户老板逼着修改上一个程序员写的代码,问候过他亲人的, 都会觉得这是十分必要的。
但是,世事无绝对。由于 __get() 和 __set() 是在遍历所有成员变量,找不到匹配的成员变量时才被调用。 因此,其效率天生地低于使用成员变量的形式。在一些表示数据结构、数据集合等简单情况下,且不需读写控制等, 可以考虑使用成员变量作为属性,这样可以提高一点效率。
另外一个提高效率的小技巧就是:使用 $pro = $object-&getPro() 来代替 $pro = $object-&pro , 用 $objcect-&setPro($value) 来代替 $object-&pro = $value 。 这在功能上是完全一样的效果,但是避免了使用 __get() 和 __set() ,相当于绕过了遍历的过程。
这里估计有人该骂我了,Yii好不容易实现了属性的机制,就是为了方便开发者, 结果我却在这里教大家怎么使用原始的方式,去提高所谓的效率。 嗯,确实,开发的便利性与执行高效率存在一定的矛盾。我个人的观点更倾向于以便利为先, 用好、用足Yii为我们创造的便利条件。至于效率的事情,更多的是框架自身需要注意的, 我们只要别写出格外2的代码就OK了。
不过你完全可以放心,在Yii的框架中,极少出现 $app-&request 之类的代码,而是使用 $app-&getRequest() 。 换句话说,框架自身还是格外地注重效率的,至于便利性,则留给了开发者。 总之,这里只是点出来有这么一个知识点,至于用不用,怎么用,完全取决于你了。
值得注意的是:
由于自动调用 __get() __set() 的时机仅仅发生在访问不存在的成员变量时。 因此,如果定义了成员变量 public $title 那么,就算定义了 getTitle() setTitle() , 他们也不会被调用。因为 $post-&title 时,会直接指向该 pulic $title , __get() __set() 是不会被调用的。从根上就被切断了。
由于PHP对于类方法不区分大小写,即大小写不敏感, $post-&getTitle() 和 $post-&gettitle() 是调用相同的函数。 因此, $post-&title 和 $post-&Title 是同一个属性。即属性名也是不区分大小写的。
由于 __get() __set() 都是public的, 无论将 getTitle() setTitle() 声明为 public, private, protected, 都没有意义,外部同样都是可以访问。所以,所有的属性都是public的。
由于 __get() __set() 都不是static的,因此,没有办法使用static 的属性。
Object的其他与属性相关的方法
除了 __get() __set() 之外, yii\base\Object 还提供了以下方法便于使用属性:
__isset() 用于测试属性值是否不为 null ,在 isset($object-&property) 时被自动调用。 注意该属性要有相应的getter。
__unset() 用于将属性值设为 null ,在 unset($object-&property) 时被自动调用。 注意该属性要有相应的setter。
hasProperty() 用于测试是否有某个属性。即,定义了getter或setter。 如果 hasProperty() 的参数 $checkVars = true (默认为true), 那么只要具有同名的成员变量也认为具有该属性,如前面提到的 public $title 。
canGetProperty() 测试一个属性是否可读,参数 $checkVars 的意义同上。只要定义了getter,属性即可读。 同时,如果 $checkVars 为 true 。那么只要类定义了成员变量,不管是public, private 还是 protected, 都认为是可读。
canSetProperty() 测试一个属性是否可写,参数 $checkVars 的意义同上。只要定义了setter,属性即可写。 同时,在 $checkVars 为 ture 。那么只要类定义了成员变量,不管是public, private 还是 protected, 都认为是可写。
Object和Component
yii\base\Component 继承自 yii\base\Object ,因此,他也具有属性等基本功能。
但是,由于Componet还引入了事件、行为,因此,它并非简单继承了Object的属性实现方式,而是基于同样的机制, 重载了 __get() __set() 等函数。但从实现机制上来讲,是一样的。这个不影响理解。
前面说过,官方将Yii定位于一个基于组件的框架。可见组件这一概念是Yii的基础。 如果你有兴趣阅读Yii的源代码或是API文档,你将会发现, Yii几乎所有的核心类都派生于(继承自) yii\base\Component 。
在Yii1.1时,就已经有了component了,那时是 CComponent。Yii2将Yii1.1中的CComponent拆分成两个类: yii\base\Object 和 yii\base\Component 。
其中,Object比较轻量级些,通过getter和setter定义了类的属性(property)。 Component派生自Object,并支持事件(event)和行为(behavior)。因此,Component类具有三个重要的特性:
属性(property)
事件(event)
行为(behavior)
相信你或多或少了解过,这三个特性是丰富和拓展类功能、改变类行为的重要切入点。 因此,Component在Yii中的地位极高。
在提供更多功能、更多便利的同时,Component由于增加了event和behavior这两个特性, 在方便开发的同时,也牺牲了一定的效率。 如果开发中不需要使用event和behavior这两个特性,比如表示一些数据的类。 那么,可以不从Component继承,而从Object继承。 典型的应用场景就是如果表示用户输入的一组数据,那么,使用Object。 而如果需要对对象的行为和能响应处理的事件进行处理,毫无疑问应当采用Component。 从效率来讲,Object更接近原生的PHP类,因此,在可能的情况下,应当优先使用Object。
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:
[][][][][][][][][][]

我要回帖

更多关于 yii框架中文手册 的文章

 

随机推荐