목차
Yii2的深入学习--yii\base\Object 类,yii2--yii
php教程 php手册 Yii2的深入学习--yiibaseObject 类,yii2--yii

Yii2的深入学习--yiibaseObject 类,yii2--yii

Jun 13, 2016 am 08:51 AM
base object yii2 공부하다 깊이 들어가다 ~의 친절한

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

之前我们说过 Yii2 中大多数类都继承自 yii\base\Object,今天就让我们来看一下这个类。

Object 是一个基础类,实现了属性的功能,其基本内容如下:

<?<span>php
namespace yii\base;

</span><span>use</span><span> Yii;

</span><span>/*</span><span>*
 * Object 是一个基础类,实现了属性的功能
 * Yii最基础的类,大多数类都继承了该类
 </span><span>*/</span>
<span>class</span> <span>Object</span> <span>implements</span><span> Configurable
{
    </span><span>/*</span><span>*
     * 获取静态方法调用的类名。返回类的名称,如果不是在类中调用则返回 FALSE。
     </span><span>*/</span>
    <span>public</span> <span>static</span> <span>function</span><span> className()
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * Constructor.
     </span><span>*/</span>
    <span>public</span> <span>function</span> __construct(<span>$config</span> =<span> [])
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 初始化对象
     </span><span>*/</span>
    <span>public</span> <span>function</span><span> init()
    {
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 getter
     </span><span>*/</span>
    <span>public</span> <span>function</span> __get(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> __set(<span>$name</span>, <span>$value</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 isset,基于 getter 实现,有 getter 方法的属性才算存在
     </span><span>*/</span>
    <span>public</span> <span>function</span> __isset(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 魔术方法,实现 unset,基于 setter 实现,有 setter 方法的属性才能 unset 掉
     </span><span>*/</span>
    <span>public</span> <span>function</span> __unset(<span>$name</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * Calls the named method which is not a class method.
     </span><span>*/</span>
    <span>public</span> <span>function</span> __call(<span>$name</span>, <span>$params</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否具有 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter/setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> hasProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否能够获取 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter
     </span><span>*/</span>
    <span>public</span> <span>function</span> canGetProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否能够设置 $name 属性,如果 $checkVars 为 true,则不局限于是否有 setter
     </span><span>*/</span>
    <span>public</span> <span>function</span> canSetProperty(<span>$name</span>, <span>$checkVars</span> = <span>true</span><span>)
    {
        </span>...<span>
    }

    </span><span>/*</span><span>*
     * 检查对象或类是否具有 $name 方法
     </span><span>*/</span>
    <span>public</span> <span>function</span> hasMethod(<span>$name</span><span>)
    {
        </span>...<span>
    }
}</span>
로그인 후 복사

如果想看详细的注释的话,可以访问 https://github.com/ReadCode/yii2-2.0.3-annotated/blob/master/framework/base/Object.php

从上面的内容中,我们可以看到 Object 类重写了 __get 和 __set 方法,下面我们来详细看下这两个方法:

    <span>/*</span><span>*
     * 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;`.
     *
     * 魔术方法,实现 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()
     </span><span>*/</span>
    <span>public</span> <span>function</span> __get(<span>$name</span><span>)
    {
        </span><span>$getter</span> = 'get' . <span>$name</span><span>;
        </span><span>if</span> (<span>method_exists</span>(<span>$this</span>, <span>$getter</span><span>)) {
            </span><span>//</span><span> 对象存在 $getter 方法,就直接调用</span>
            <span>return</span> <span>$this</span>-><span>$getter</span><span>();
        } </span><span>elseif</span> (<span>method_exists</span>(<span>$this</span>, 'set' . <span>$name</span><span>)) {
            </span><span>//</span><span> 如果存在 'set' . $name 方法,就认为该属性是只写的</span>
            <span>throw</span> <span>new</span> InvalidCallException('Getting write-only property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        } </span><span>else</span><span> {
            </span><span>//</span><span> 否则认为该属性不存在</span>
            <span>throw</span> <span>new</span> UnknownPropertyException('Getting unknown property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        }
    }

    </span><span>/*</span><span>*
     * 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;`.
     *
     * 魔术方法,实现 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()
     </span><span>*/</span>
    <span>public</span> <span>function</span> __set(<span>$name</span>, <span>$value</span><span>)
    {
        </span><span>$setter</span> = 'set' . <span>$name</span><span>;
        </span><span>if</span> (<span>method_exists</span>(<span>$this</span>, <span>$setter</span><span>)) {
            </span><span>//</span><span> 对象存在 $setter 方法,就直接调用</span>
            <span>$this</span>-><span>$setter</span>(<span>$value</span><span>);
        } </span><span>elseif</span> (<span>method_exists</span>(<span>$this</span>, 'get' . <span>$name</span><span>)) {
            </span><span>//</span><span> 如果存在 'get' . $name 方法,就认为该属性是只读的</span>
            <span>throw</span> <span>new</span> InvalidCallException('Setting read-only property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        } </span><span>else</span><span> {
            </span><span>//</span><span> 否则认为该属性不存在</span>
            <span>throw</span> <span>new</span> UnknownPropertyException('Setting unknown property: ' . <span>get_class</span>(<span>$this</span>) . '::' . <span>$name</span><span>);
        }
    }</span>
로그인 후 복사

基于上面的代码,我们可以看到,如果访问一个 Object 对象的某个属性, Yii会调用名为 get属性名() 的函数。如, SomeObject->Foo , 会自动调用 SomeObject->getFoo()。 如果修改某一属性,会调用相应的setter函数。 如, SomeObject->Foo = $someValue ,会自动调用 SomeObject->setFoo($someValue)

以 SomeObject 的 Foo 为例,如果只存在 getFoo() 方法,那它就是只读的,如果只存在 setFoo() 方法,那它就是只写的,只有两个方法都存在的时候才是既可读又可写的。

需要注意的一点是只有在读取和写入对象的一个不存在的成员变量时, __get() __set() 会被自动调用。 如果 Foo 是一个 public 的属性就不会经过 __get() 和 __set() 方法了。

所以通常属性是 private 的,举个例子如下:

<span>class</span> User <span>extends</span> yii\base\<span>Object</span><span>
{
    </span><span>private</span> <span>$_name</span><span>;

    </span><span>public</span> <span>function</span><span> getName()
    {
        </span><span>return</span> <span>$this</span>-><span>_name;
    }

    </span><span>public</span> <span>function</span> setName(<span>$name</span><span>)
    {
        </span><span>$this</span>->_name = <span>trim</span>(<span>$name</span><span>);
    }
}</span>
로그인 후 복사

我们还可以在 get 和 set 方法中做一些特殊的处理。

除了 __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, 都认为是可写。

 

对 Yii2 源码有兴趣的同学可以关注项目 yii2-2.0.3-annotated,现在在上面已经添加了不少关于 Yii2 源码的注释,之后还会继续添加~

有兴趣的同学也可以参与进来,提交 Yii2 源码的注释。

 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

기본 DEX 수도꼭지: 비행장 VS 곡선 기본 DEX 수도꼭지: 비행장 VS 곡선 Mar 26, 2024 pm 04:31 PM

Velodrome 모델은 veCRV에서 영감을 얻었으며 유동성 공급자(LP), 토큰 보유자 및 유동성이 필요한 프로젝트를 포함하여 DEX의 세 가지 주요 참여자 간에 탁월한 일관성을 달성하는 것을 목표로 합니다. 그러나 DeFi 공간의 많은 플레이어는 여전히 근본적인 이유를 완전히 이해하지 못하고 있습니다. 이 글을 깊이 있게 읽으면, 이 딜레마에서 벗어나 그 근본 원인을 파악할 수 있을 것입니다. 오늘은 DeFi 분야의 실제 성공 사례인 Velodrome/Aerodrome에 대해 논의하겠습니다. 이 기사에서는 두 모델을 비교하고 Velodrome이 veCRV 모델을 어떻게 개선하고 이러한 작은 차이가 어떤 중요한 영향을 미치는지 설명합니다. 먼저 말씀드리자면

C 언어의 매력을 밝히다: 프로그래머의 잠재력을 발견하다 C 언어의 매력을 밝히다: 프로그래머의 잠재력을 발견하다 Feb 24, 2024 pm 11:21 PM

C 언어 학습의 매력: 프로그래머의 잠재력을 여는 것 지속적인 기술 발전으로 컴퓨터 프로그래밍은 많은 주목을 받는 분야가 되었습니다. 많은 프로그래밍 언어 중에서 C 언어는 항상 프로그래머들에게 사랑을 받아 왔습니다. C 언어의 단순성, 효율성 및 폭넓은 적용 덕분에 많은 사람들이 프로그래밍 분야에 입문하는 첫 번째 단계는 C 언어입니다. 이 기사에서는 C 언어 학습의 매력과 C 언어 학습을 통해 프로그래머의 잠재력을 발휘하는 방법에 대해 설명합니다. 우선, C 언어 학습의 매력은 단순함에 있습니다. C언어는 다른 프로그래밍 언어에 비해

워드에서 근수를 입력하는 방법을 함께 알아볼까요? 워드에서 근수를 입력하는 방법을 함께 알아볼까요? Mar 19, 2024 pm 08:52 PM

Word에서 텍스트 내용을 편집할 때 수식 기호를 입력해야 하는 경우가 있습니다. 어떤 사람들은 Word에서 근수를 입력하는 방법을 모르기 때문에 편집자에게 Word에서 근수를 입력하는 방법에 대한 튜토리얼을 친구들과 공유해달라고 요청했습니다. 그것이 내 친구들에게 도움이 되기를 바랍니다. 먼저 컴퓨터에서 Word 소프트웨어를 연 다음 편집하려는 파일을 열고 루트 기호를 삽입해야 하는 위치로 커서를 이동합니다. 아래 그림 예를 참조하세요. 2. [삽입]을 선택한 후, 기호에서 [수식]을 선택하세요. 아래 그림의 빨간색 원과 같이 3. 아래의 [새 수식 삽입]을 선택하세요. 아래 그림의 빨간색 원과 같이 4. [부수]를 선택한 후 해당 부수를 선택합니다. 아래 그림의 빨간색 원에 표시된 대로:

Go 언어의 주요 기능을 처음부터 배우세요 Go 언어의 주요 기능을 처음부터 배우세요 Mar 27, 2024 pm 05:03 PM

제목: Go 언어의 주요 기능을 처음부터 배우세요. Go 언어는 간단하고 효율적인 프로그래밍 언어로 개발자들이 선호합니다. Go 언어에서 main 함수는 진입 함수이고, 모든 Go 프로그램은 프로그램의 진입점으로 main 함수를 포함해야 합니다. 이 글에서는 Go 언어의 주요 기능을 처음부터 배우는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 먼저 Go 언어 개발 환경을 설치해야 합니다. 공식 홈페이지(https://golang.org)에 접속하시면 됩니다.

20개의 Dune 분석 대시보드를 이해하고 체인의 추세를 빠르게 파악하세요. 20개의 Dune 분석 대시보드를 이해하고 체인의 추세를 빠르게 파악하세요. Mar 13, 2024 am 09:19 AM

원저자: Minty, 암호화 KOL 원본 편집: Shenchao TechFlow 사용법을 알고 있다면 Dune은 올인원 알파 도구입니다. 20개의 Dune 대시보드를 사용하여 연구를 한 단계 더 발전시키세요. 1. TopHolder 분석 @dcfpascal이 개발한 이 간단한 도구는 보유자의 월간 활동, 고유 보유자 수, 지갑 손익 비율과 같은 지표를 기반으로 토큰을 분석할 수 있습니다. 방문 링크: https://dune.com/dcfpascal/token-holders2 토큰 개요 측정항목 @andrewhong5297이 사용자 작업을 분석하여 토큰을 평가하는 방법을 제공하는 이 대시보드를 만들었습니다.

Base Dawgz($DAWGZ) 멀티체인 토큰이 오늘 분산형 거래소에 출시되었습니다. Base Dawgz($DAWGZ) 멀티체인 토큰이 오늘 분산형 거래소에 출시되었습니다. Sep 06, 2024 am 06:34 AM

Base의 첫 번째 멀티체인 토큰인 Base Dawgz($DAWGZ)가 오늘 분산형 거래소에 출시되었습니다. $DAWGZ는 CET 18시에 DEX에 데뷔했으며 첫 번째로

'PHP의 객체 지향 프로그래밍 소개: 개념에서 실습까지' 'PHP의 객체 지향 프로그래밍 소개: 개념에서 실습까지' Feb 25, 2024 pm 09:04 PM

객체 지향 프로그래밍이란 무엇입니까? 객체 지향 프로그래밍(OOP)은 실제 엔터티를 클래스로 추상화하고 객체를 사용하여 이러한 엔터티를 나타내는 프로그래밍 패러다임입니다. 클래스는 객체의 속성과 동작을 정의하고, 객체는 클래스를 인스턴스화합니다. OOP의 가장 큰 장점은 코드를 더 쉽게 이해하고 유지 관리하며 재사용할 수 있다는 것입니다. OOP의 기본 개념 OOP의 주요 개념에는 클래스, 개체, 속성 및 메서드가 포함됩니다. 클래스는 객체의 속성과 동작을 정의하는 객체의 청사진입니다. 객체는 클래스의 인스턴스이며 클래스의 모든 속성과 동작을 갖습니다. 속성은 데이터를 저장할 수 있는 개체의 특성입니다. 메소드는 객체의 데이터에 대해 작동할 수 있는 객체의 함수입니다. OOP의 장점 OOP의 주요 장점은 다음과 같습니다. 재사용성: OOP는 코드를 더 많이 만들 수 있습니다.

Dedecms 인코딩 변환 기능을 배우는 간단한 방법 Dedecms 인코딩 변환 기능을 배우는 간단한 방법 Mar 14, 2024 pm 02:09 PM

Dedecms 인코딩 변환 기능을 배우는 것은 복잡하지 않습니다. 간단한 코드 예제를 통해 이 기술을 빠르게 익힐 수 있습니다. Dedecms에서 인코딩 변환 기능은 일반적으로 시스템의 정상적인 작동과 데이터의 정확성을 보장하기 위해 중국어 왜곡 문자 및 특수 문자와 같은 문제를 처리하는 데 사용됩니다. 다음은 다양한 인코딩 관련 요구에 쉽게 대처할 수 있도록 Dedecms의 인코딩 변환 기능을 사용하는 방법을 자세히 소개합니다. 1.UTF-8에서 GBK로 Dedecms에서 UTF-8로 인코딩된 문자열을 G로 변환해야 하는 경우

See all articles