日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Yii2的深入学习--yii\base\Object 类

發(fā)布時間:2025/4/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Yii2的深入学习--yii\base\Object 类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前我們說過?Yii2 中大多數(shù)類都繼承自 yii\base\Object,今天就讓我們來看一下這個類。

Object 是一個基礎(chǔ)類,實現(xiàn)了屬性的功能,其基本內(nèi)容如下:

<?php namespace yii\base;use Yii;/*** Object 是一個基礎(chǔ)類,實現(xiàn)了屬性的功能* Yii最基礎(chǔ)的類,大多數(shù)類都繼承了該類*/ class Object implements Configurable {/*** 獲取靜態(tài)方法調(diào)用的類名。返回類的名稱,如果不是在類中調(diào)用則返回 FALSE。*/public static function className(){...}/*** Constructor.*/public function __construct($config = []){...}/*** 初始化對象*/public function init(){}/*** 魔術(shù)方法,實現(xiàn) getter*/public function __get($name){...}/*** 魔術(shù)方法,實現(xiàn) setter*/public function __set($name, $value){...}/*** 魔術(shù)方法,實現(xiàn) isset,基于 getter 實現(xiàn),有 getter 方法的屬性才算存在*/public function __isset($name){...}/*** 魔術(shù)方法,實現(xiàn) unset,基于 setter 實現(xiàn),有 setter 方法的屬性才能 unset 掉*/public function __unset($name){...}/*** Calls the named method which is not a class method.*/public function __call($name, $params){...}/*** 檢查對象或類是否具有 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 getter/setter*/public function hasProperty($name, $checkVars = true){...}/*** 檢查對象或類是否能夠獲取 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 getter*/public function canGetProperty($name, $checkVars = true){...}/*** 檢查對象或類是否能夠設(shè)置 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 setter*/public function canSetProperty($name, $checkVars = true){...}/*** 檢查對象或類是否具有 $name 方法*/public function hasMethod($name){...} }

如果想看詳細(xì)的注釋的話,可以訪問?https://github.com/ReadCode/yii2-2.0.3-annotated/blob/master/framework/base/Object.php

從上面的內(nèi)容中,我們可以看到 Object 類重寫了?__get?和 __set 方法,下面我們來詳細(xì)看下這兩個方法:

/*** Returns the value of an object property.** Do not call this method directly as it is a PHP magic method that* will be implicitly called when executing `$value = $object->property;`.** 魔術(shù)方法,實現(xiàn) getter** @param string $name the property name* @return mixed the property value* @throws UnknownPropertyException if the property is not defined* @throws InvalidCallException if the property is write-only* @see __set()*/public function __get($name){$getter = 'get' . $name;if (method_exists($this, $getter)) {// 對象存在 $getter 方法,就直接調(diào)用return $this->$getter();} elseif (method_exists($this, 'set' . $name)) {// 如果存在 'set' . $name 方法,就認(rèn)為該屬性是只寫的throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);} else {// 否則認(rèn)為該屬性不存在throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);}}/*** Sets value of an object property.** Do not call this method directly as it is a PHP magic method that* will be implicitly called when executing `$object->property = $value;`.** 魔術(shù)方法,實現(xiàn) setter** @param string $name the property name or the event name* @param mixed $value the property value* @throws UnknownPropertyException if the property is not defined* @throws InvalidCallException if the property is read-only* @see __get()*/public function __set($name, $value){$setter = 'set' . $name;if (method_exists($this, $setter)) {// 對象存在 $setter 方法,就直接調(diào)用$this->$setter($value);} elseif (method_exists($this, 'get' . $name)) {// 如果存在 'get' . $name 方法,就認(rèn)為該屬性是只讀的throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);} else {// 否則認(rèn)為該屬性不存在throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);}}

基于上面的代碼,我們可以看到,如果訪問一個 Object 對象的某個屬性, Yii會調(diào)用名為?get屬性名()?的函數(shù)。如,?SomeObject->Foo?, 會自動調(diào)用?SomeObject->getFoo()。 如果修改某一屬性,會調(diào)用相應(yīng)的setter函數(shù)。 如,?SomeObject->Foo?=?$someValue?,會自動調(diào)用?SomeObject->setFoo($someValue)?。

以?SomeObject 的 Foo 為例,如果只存在?getFoo() 方法,那它就是只讀的,如果只存在?setFoo() 方法,那它就是只寫的,只有兩個方法都存在的時候才是既可讀又可寫的。

需要注意的一點是只有在讀取和寫入對象的一個不存在的成員變量時,?__get()?__set()?會被自動調(diào)用。 如果 Foo 是一個 public 的屬性就不會經(jīng)過?__get() 和??__set() 方法了。

所以通常屬性是 private 的,舉個例子如下:

class User extends yii\base\Object {private $_name;public function getName(){return $this->_name;}public function setName($name){$this->_name = trim($name);} }

我們還可以在 get 和 set 方法中做一些特殊的處理。

除了?__get()?__set()?之外,?yii\base\Object?還提供了以下方法便于使用屬性:

  • __isset()?用于測試屬性值是否不為?null?,在?isset($object->property)?時被自動調(diào)用。 注意該屬性要有相應(yīng)的 getter。
  • __unset()?用于將屬性值設(shè)為?null?,在?unset($object->property)?時被自動調(diào)用。 注意該屬性要有相應(yīng)的 setter。
  • hasProperty()?用于測試是否有某個屬性。即,定義了 getter 或 setter。 如果?hasProperty()?的參數(shù)?$checkVars?=?true?(默認(rèn)為true), 那么只要具有同名的成員變量也認(rèn)為具有該屬性,如前面提到的?public?$title?。
  • canGetProperty()?測試一個屬性是否可讀,參數(shù)?$checkVars?的意義同上。只要定義了 getter,屬性即可讀。 同時,如果?$checkVars?為?true?。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認(rèn)為是可讀。
  • canSetProperty()?測試一個屬性是否可寫,參數(shù)?$checkVars?的意義同上。只要定義了 setter,屬性即可寫。 同時,在?$checkVars?為?ture?。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認(rèn)為是可寫。

?

對 Yii2 源碼有興趣的同學(xué)可以關(guān)注項目?yii2-2.0.3-annotated,現(xiàn)在在上面已經(jīng)添加了不少關(guān)于 Yii2 源碼的注釋,之后還會繼續(xù)添加~

有興趣的同學(xué)也可以參與進來,提交?Yii2 源碼的注釋。

?

轉(zhuǎn)載于:https://www.cnblogs.com/CraryPrimitiveMan/p/4947059.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Yii2的深入学习--yii\base\Object 类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。