返回顶部
首页 > 资讯 > 数据库 >Object和Component的区别是什么
  • 693
分享到

Object和Component的区别是什么

2024-04-02 19:04:59 693人浏览 安东尼
摘要

这篇文章给大家介绍Object和Component的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  由于Componet引入了事件、行为,因此,它并非简单继承了Object

这篇文章给大家介绍Object和Component的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

  由于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。

  Object的配置方法

  Yii提供了一个统一的配置对象的方式。这一方式贯穿整个Yii。Application对象的配置就是这种配置方式的体现:

  $config = yii\helpers\ArrayHelper::merge(

  require(__DIR__ . '/../../common/config/main.php'),

  require(__DIR__ . '/../../common/config/main-local.php'),

  require(__DIR__ . '/../config/main.php'),

  require(__DIR__ . '/../config/main-local.php')

  );

  $application = new yii\WEB\Application($config);

  $config 看着复杂,但本质上就是一个各种配置项的数组。Yii中就是统一使用数组的方式对对象进行配置,而实现这一切的关键就在 yii\base\Object 定义的构造函数中:

  public function __construct($config = [])

  {

  if (!empty($config)) {

  Yii::configure($this, $config);

  }

  $this->init();

  }

  所有 yii\base\Object 的构建流程是:

  构建函数以 $config 数组为参数被自动调用。

  构建函数调用 Yii::configure() 对对象进行配置。

  在最后,构造函数调用对象的 init() 方法进行初始化。

  数组配置对象的秘密在 Yii::configure() 中,但说破了其实也没有什么神奇的:

  public static function configure($object, $properties)

  {

  foreach ($properties as $name => $value) {

  $object->$name = $value;

  }

  return $object;

  }

  配置的过程就是遍历 $config 配置数组,将数组的键作为属性名,以对应的数组元素的值对对象的属性赋值。因此,实现Yii这一统一的配置方式的要点有:

  继承自 yii\base\Object 。

  为对象属性提供setter方法,以正确处理配置过程。

  如果需要重载构造函数,请将 $config 作为该构造函数的最后一个参数,并将该参数传递给父构造函数。

  重载的构造函数的最后,一定记得调用父构造函数。

  如果重载了 yii\base\Object::init() 函数,注意一定要在重载函数的开头调用父类的 init() 。

  只要实现了以上要点,就可以使得你编写的类可以按照Yii约定俗成的方式进行配置。这在编写代码的过程中,带来许多便利。

  像你这么聪明的,肯定会提出来,如果配置数组的某个配置项,也是一个数组,这怎么办? 如果某个对象的属性,也是一个对象,而非一个简单的数值或字符串时,又怎么办?

  这两个问题,其实是同质的。如果一个对象的属性,是另一个对象,就像Application里会引入诸多的Component一样, 这是很常见的。如后面会看到的 $app->request 中的 request 属性就是一个对象。 那么,在配置 $app 时,必然要配置到这个 reqeust 对象。 既然 request 也是一个对象,那么他的配置要是按照Yii的规矩来,也就是用一个数组来配置它。 因此,上面提到的这两个问题,其实是同质的。

  那么,怎么实现呢?秘密在于setter函数。由于 $app 在进行配置时,最终会调用 Yii::configure() 函数。 该函数又不区分配置项是简单的数值还是数组,就直接使用 $object->$name = $value 完成属性的赋值。 那么,对于对象属性,其配置值 $value 是一个数组,为了使其正确配置。 你需要在其setter函数上做出正确的处理方式。 Yii应用 yii\web\Application 就是依靠定义专门的setter函数,实现自动处理配置项的。 比如,我们在Yii的配置文件中,可以看到一个配置项 components ,一般情况下,他的内容是这样的:

  'components' => [

  'request' => [

  // !!! insert a secret key in the following (if it is empty) -

  // this is required by cookie validation

  'cookieValidationKey' => 'v7mBbyetv4ls7t8UIqQ2IBO60jY_wf_U',

  ],

  'user' => [

  'identityClass' => 'common\models\User',

  'enableAutoLogin' => true,

  ],

  'log' => [

  'traceLevel' => YII_DEBUG ? 3 : 0,

  'targets' => [

  [

  'class' => 'yii\log\FileTarget',

  'levels' => ['error', 'warning'],

  ],

  ],

  ],

  'errorHandler' => [

  'errorAction' => 'site/error',

  ],

  ],

  这是一个典型嵌套配置数组。那么Yii是如何把他们配置好的呢? 聪明的你肯定想到了,Yii一定是定义了一个名为 setComponents 的setter函数。 当然,Yii并未将该函数放在 yii\web\Application 里,而是放在父类 yii\di\ServiceLocator 里面。 至于 ServiceLocator 是何方神圣,在后面 服务定位器(Service Locator) 部分会讲到, 这里你只需要知道它是Application的父类,提供components属性的setter方法就可以了:

  public function setComponents($components)

  {

  foreach ($components as $id => $component) {

  $this->set($id, $component);

  }

  }

  这里有个成员函数, $this->set() ,他是服务定位器用来注册服务的方法。 我们暂时不讲这个东西,留待 服务定位器(Service Locator) 部分再讲。 现在只要知道这个函数把配置文件中的 components 配置项搞定就可以了。

  从 yii\base\Object::__construct() 来看,对于所有Object,包括Component的属性,都经历这么4个阶段:

  预初始化阶段。这是最开始的阶段,就是在构造函数 __construct() 的开头可以设置property的默认值。

  对象配置阶段。也就是前面提到构造函数调用 Yii::configure($this, $config) 阶段。 这一阶段可以覆盖前一阶段设置的property的默认值,并补充没有默认值的参数,也就是必备参数。 $config 通常由外部代码传入或者通过配置文件传入。

  后初始化阶段。也就是构造函数调用 init() 成员函数。 通过在 init() 写入代码,可以对配置阶段设置的值进行检查,并规范类的property。

  类方法调用阶段。前面三个阶段是不可分的,由类的构造函数一口气调用的。 也就是说一个类一但实例化,那么就至少经历了前三个阶段。 此时,该对象的状态是确定且可靠的,不存在不确定的property。 所有的属性要么是默认值,要么是传入的配置值,如果传入的配置有误或者冲突,那么也经过了检查和规范。 也就是说,你就放心用吧。

关于Object和Component的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: Object和Component的区别是什么

本文链接: https://lsjlt.com/news/58039.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Object和Component的区别是什么
    这篇文章给大家介绍Object和Component的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  由于Componet引入了事件、行为,因此,它并非简单继承了Object...
    99+
    2024-04-02
  • Spring注解@Configuration和@Component区别是什么
    本篇内容主要讲解“Spring注解@Configuration和@Component区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring注解@Configuration和@Com...
    99+
    2023-07-05
  • Spring注解中@Configuration和@Component的区别是什么
    本文小编为大家详细介绍“Spring注解中@Configuration和@Component的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring注解中@Configuration和@Component的区别是什么”文章能...
    99+
    2023-07-05
  • es6中map和object的区别是什么
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。Map和Object的概念Object在ECMAScript中,Object是一个特殊的对象。它本身是一个顶级对象,同时还是一个构造函数,可以通过它(如:...
    99+
    2022-11-22
    ES6
  • SpringBoot在容器中创建@Component和@bean的区别是什么
    本篇内容介绍了“SpringBoot在容器中创建@Component和@bean的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!@...
    99+
    2023-07-05
  • JavaScript中Object和Map有什么区别
    这篇文章主要讲解了“JavaScript中Object和Map有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中Object和M...
    99+
    2024-04-02
  • Spring @bean和@component注解区别
    目录Spring 中的一些注解1. @Component 和 @Bean 的区别是什么?2. Autowire 和 @Resource 的区别3. 将一个类声明为 Spring 的 ...
    99+
    2024-04-02
  • php === 和==的区别是什么
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php === 和==的区别是什么?php中的==和===的用法及区别在开发中进场遇到数值匹配的问题,那么在进行匹配时,遇到下面的情况,你觉得结果是什么?<php ...
    99+
    2021-03-17
    php
  • ./ 和 sh 的区别是什么
    ./ 和 sh 的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。./ 和 sh的使用区别使用“./”执行脚本,对应的xxx.sh脚本必须要有执行权限;使用“sh”...
    99+
    2023-06-09
  • Spring注解@Configuration和@Component区别详解
    目录@Configuration 注解:加载过程@Bean 注解方法执行策略@Component 注意总结Spring @Configuration 和 @Component 区别 ...
    99+
    2023-05-14
    spring configuration component configuration和component的区别 spring @cconfiguration
  • 解读new Object()和Object.create()的区别
    目录Object.create()new Object()区别创建对象new Object() 和 Object.create()区分总结Object.create() 创建一个新对...
    99+
    2023-02-10
    new Object() Object.create() new Object和Object.create区别
  • react的component是什么
    本教程操作环境:Windows7系统、react18版、Dell G3电脑。在React,组件(component),就是一个UI的单元,是封装起来的具有独立功能的UI部件。它的思想是,将要展示的内容,分成多个独立部分,每一个这样的部分,就...
    99+
    2023-05-14
    组件 component React
  • php和j2ee的区别是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php和j2ee的区别是什么J2EE Java 2 Platform ,Enterprise Edition Java 2平台,企业版J2EE可以创建分布式的大型跨平...
    99+
    2020-10-13
    php
  • php4和php5的区别是什么
    本教程操作环境:windows10系统、PHP7.1版、DELL G3电脑php4和php5的区别是什么构造函数和析构函数在 PHP4 中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在 PHP4 中没有析构函数的概念。在 PH...
    99+
    2015-12-28
    PHP
  • php5.6和php7的区别是什么
    本教程操作环境:windows10系统、PHP7.1版、DELL G3电脑php5.6和php7的区别是什么一、俩者的区别PHP7.0比PHP5.6性能提升了俩倍。PHP7.0全面一致支持64位。PHP7.0之前出现的致命错误,都改成了抛出...
    99+
    2018-06-05
    PHP
  • android和java的区别是什么
    从整体来讲,java和android的区别在于android程序是基于组件和配置的,而且android开发以java语言为开发工具,表面上看他们有点同宗不同门,但实际上区别十分大,android是一个主流智能手机操作系统,java是一种开发...
    99+
    2019-02-19
    java教程 android java 区别
  • c 和java的区别是什么
    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM...
    99+
    2019-02-23
    java教程 c java 区别
  • j2ee和java的区别是什么?
    什么是java?java是一种编程语言,java不仅有着c++的优点,还放弃了一些难以理解的名词,目前java是一种面向对象的代表,java语言简单易用,而且功能强大,因此很多程序员使用java编程桌面程序,和嵌入式系统。Java是一种可以...
    99+
    2020-12-18
    java入门 j2ee java
  • js和java的区别是什么?
    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。js(JavaScript)是一种直译式脚本语言,是一种动态类型、弱类型、基于原型...
    99+
    2015-02-08
    js java
  • php5.4和5.6的区别是什么
    PHP5.4和5.6的区别是:1、5.6版本在定义变量时允许使用之前定义的常量进行计算,并且允许常量作为函数参数默认值,而5.4版本则不允许;2、5.6版本命名空间支持常量和函数,而5.4版本不支持。本文操作环境:Windows10系统、P...
    99+
    2022-06-22
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作