php教程 php手册 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 - webabcd

速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 - webabcd

May 20, 2016 am 10:14 AM

[源码下载]


速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间



作者:webabcd


介绍
速战速决 之 PHP

  • 动态地创建属性和方法
  • 对象的复制
  • 对象的比较
  • 加载指定的文件
  • 自动加载类文件
  • 命名空间



示例
1、类的相关知识点 3(动态地创建属性和方法)
class/class3.php

<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 类的相关知识点 3(动态地创建属性和方法)
 </span><span style="color: #008000;">*/</span>

<span style="color: #008000;">//</span><span style="color: #008000;"> 用于演示如何动态地创建属性(这就是 php 中所谓的重载)</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Class1
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __set(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$value</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">echo</span> "__set \$name: {<span style="color: #800080;">$name</span>}, \$value: {<span style="color: #800080;">$value</span>}"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> __get 魔术方法,当获取的属性不存在或者不可访问(private)时就会调用此函数</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __get(<span style="color: #800080;">$name</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">echo</span> "__get \$name: {<span style="color: #800080;">$name</span>}"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;

        </span><span style="color: #0000ff;">return</span> 999<span style="color: #000000;">;
    }
}

</span><span style="color: #800080;">$objClass1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Class1();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 当你设置的属性不存在或者不可访问(private)时,就会调用对应的 __set 魔术方法</span>
<span style="color: #800080;">$objClass1</span>->property1 = wanglei; <span style="color: #008000;">//</span><span style="color: #008000;"> 不可访问的如 private ,或者不存在的

// 当你获取的属性不存在或者不可访问(private)时,就会调用对应的 __get 魔术方法</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$objClass1</span>-><span style="color: #000000;">property2;
</span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;



</span><span style="color: #008000;">//</span><span style="color: #008000;"> 用于演示如何动态地创建方法(这就是 php 中所谓的重载)</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Class2
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> __call 魔术方法,当调用的实例方法不存在或者不可访问(private)时就会调用此函数</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __call(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$arguments</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">echo</span> "__call \$name: {<span style="color: #800080;">$name</span>}, \$arguments: " . <span style="color: #008080;">implode</span>(', ', <span style="color: #800080;">$arguments</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> __callStatic 魔术方法,当调用的类方法不存在或者不可访问(private)时就会调用此函数</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> __callStatic(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$arguments</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">echo</span> "__callStatic \$name: {<span style="color: #800080;">$name</span>}, \$arguments: " . <span style="color: #008080;">implode</span>(', ', <span style="color: #800080;">$arguments</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }
}

</span><span style="color: #800080;">$objClass2</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Class2();

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 当你调用的实例方法不存在或者不可访问(private)时,就会调用对应的 __call 魔术方法</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$objClass2</span>->method1("aaa", "bbb"<span style="color: #000000;">);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 当你调用的类方法不存在或者不可访问(private)时,就会调用对应的 __callStatic 魔术方法</span>
<span style="color: #0000ff;">echo</span> Class2::method2("aaa", "bbb");
로그인 후 복사


2、类的相关知识点 4(对象的复制,对象的比较)
class/class4.php

<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 类的相关知识点 4(对象的复制,对象的比较)
 </span><span style="color: #008000;">*/</span>

<span style="color: #008000;">//</span><span style="color: #008000;"> 用于演示如何复制对象</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Class1
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$field1</span> = "field1"<span style="color: #000000;">;
    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$field2</span> = "field2"<span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 通过 clone 复制对象时,会调用此魔术方法</span>
    <span style="color: #0000ff;">function</span><span style="color: #000000;"> __clone()
    {
        </span><span style="color: #0000ff;">echo</span> "__clone"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }
}

</span><span style="color: #800080;">$objClass1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Class1();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 通过 clone 复制对象,会调用 __clone 魔术方法</span>
<span style="color: #800080;">$objClass2</span> = <span style="color: #0000ff;">clone</span> <span style="color: #800080;">$objClass1</span><span style="color: #000000;">;

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 通过 clone 复制的对象为浅拷贝(shallow copy),即成员数据之间的一一赋值, 而所有的引用属性仍然会是一个指向原来的变量的引用(如果要做 deep copy 则需要自己写)</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$objClass2</span>->field1; <span style="color: #008000;">//</span><span style="color: #008000;"> output: field1</span>
<span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
</span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$objClass2</span>->field2; <span style="color: #008000;">//</span><span style="color: #008000;"> output: field2</span>
<span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;



</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果两个对象的属性和属性值都相等,则他们“==”相等,</span>
<span style="color: #0000ff;">if</span> (<span style="color: #800080;">$objClass1</span> == <span style="color: #800080;">$objClass2</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">echo</span> '$objClass1 == $objClass2'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果两个对象的属性和属性值都相等,但不是同一个类的实例,则他们“===”不相等</span>
<span style="color: #0000ff;">if</span> (<span style="color: #800080;">$objClass1</span> !== <span style="color: #800080;">$objClass2</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">echo</span> '$objClass1 !== $objClass2'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果两个对象是同一个类的实例,则他们“===”相等</span>
<span style="color: #0000ff;">if</span> (<span style="color: #800080;">$objClass1</span> === <span style="color: #800080;">$objClass1</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">echo</span> '$objClass1 === $objClass1'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果两个对象是同一个类的实例,则他们“===”相等</span>
<span style="color: #800080;">$objClass3</span> = &<span style="color: #800080;">$objClass1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$objClass1</span> === <span style="color: #800080;">$objClass3</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">echo</span> '$objClass1 === $objClass3'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
}</span>
로그인 후 복사


3、类的相关知识点 5(加载指定的文件,自动加载类文件)
class/class5.php

<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 类的相关知识点 5(加载指定的文件,自动加载类文件)
 </span><span style="color: #008000;">*/</span>

<span style="color: #008000;">/*</span><span style="color: #008000;">
 * 包含并运行指定文件,可以是绝对路径也可以是相对路径
 * include 找不到的话则警告,然后继续运行(include_once: 在当前文件中只 include 指定文件一次)
 * require 找不到的话则错误,然后终止运行(require_once: 在当前文件中只 require 指定文件一次)
 * include '';
 * require '';
 * include_once '';
 * require_once '';
</span><span style="color: #008000;">*/</span>

<span style="color: #008000;">//</span><span style="color: #008000;"> 演示如何通过 __autoload 魔术方法,来实现类的自动加载</span>
<span style="color: #0000ff;">function</span> __autoload(<span style="color: #800080;">$class_name</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加载指定的文件</span>
    <span style="color: #0000ff;">require_once</span> <span style="color: #800080;">$class_name</span> . '.class.php'<span style="color: #000000;">;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果在当前文件中找不到 MyClass 类,那么就会去调用 __autoload 魔术方法</span>
<span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass();
</span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj</span>-><span style="color: #000000;">name;
</span><span style="color: #0000ff;">echo</span> "<br>";
로그인 후 복사

class/MyClass.class.php

<span style="color: #000000;">php

</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyClass
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$name</span> = "webabcd"<span style="color: #000000;">;
}</span>
로그인 후 복사


4、类的相关知识点 6(命名空间)
class/class6.php

<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 类的相关知识点 6(命名空间)
 </span><span style="color: #008000;">*/</span>

<span style="color: #008000;">//</span><span style="color: #008000;"> 以下代码仅用于演示,实际项目中不建议在一个文件中定义多个 namespace

// 如果当前文件中只有一个命名空间,那么下面的这段可以省略掉命名空间的大括号,直接 namespace MyNamespace1; 即可</span>
<span style="color: #000000;">namespace MyNamespace1
{
    </span><span style="color: #0000ff;">const</span> MyConst = "MyNamespace1 MyConst"<span style="color: #000000;">;

    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> myFunction()
    {
        </span><span style="color: #0000ff;">echo</span> "MyNamespace1 myFunction"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }

    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyClass
    {
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> myMethod()
        {
            </span><span style="color: #0000ff;">echo</span> "MyNamespace1 MyClass myMethod"<span style="color: #000000;">;
            </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
        }
    }
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 定义命名空间时,可以指定路径</span>
<span style="color: #000000;">namespace Sub1\Sub2\MyNamespace2
{
    </span><span style="color: #0000ff;">const</span> MyConst = "MyNamespace2 MyConst"<span style="color: #000000;">;

    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> myFunction()
    {
        </span><span style="color: #0000ff;">echo</span> "MyNamespace2 myFunction"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
    }

    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyClass
    {
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> myMethod()
        {
            </span><span style="color: #0000ff;">echo</span> "MyNamespace2 MyClass myMethod"<span style="color: #000000;">;
            </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;
        }
    }
}

namespace MyNamespace3
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用指定命名空间中的指定常量</span>
    <span style="color: #0000ff;">echo</span><span style="color: #000000;"> \MyNamespace1\MyConst;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用指定命名空间中的指定函数</span>
<span style="color: #000000;">    \MyNamespace1\myFunction();

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 实例化指定命名空间中的类</span>
    <span style="color: #800080;">$obj1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> \MyNamespace1\MyClass();
    </span><span style="color: #800080;">$obj1</span>-><span style="color: #000000;">myMethod();
}

namespace MyNamespace4
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> use 指定的命名空间</span>
    <span style="color: #0000ff;">use</span><span style="color: #000000;"> \Sub1\Sub2\MyNamespace2;

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 之后不用再写全命名空间的路径了,因为之前 use 过了</span>

    <span style="color: #0000ff;">echo</span><span style="color: #000000;"> MyNamespace2\MyConst;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;

    MyNamespace2\myFunction();

    </span><span style="color: #800080;">$obj1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyNamespace2\MyClass();
    </span><span style="color: #800080;">$obj1</span>-><span style="color: #000000;">myMethod();
}

namespace MyNamespace5
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> use 指定的命名空间,并为其设置别名</span>
    <span style="color: #0000ff;">use</span> \Sub1\Sub2\MyNamespace2 <span style="color: #0000ff;">as</span><span style="color: #000000;"> xxx;

    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 之后再调用命名空间时,可以使用其别名</span>

    <span style="color: #0000ff;">echo</span><span style="color: #000000;"> xxx\MyConst;
    </span><span style="color: #0000ff;">echo</span> "<br>"<span style="color: #000000;">;

    xxx\myFunction();

    </span><span style="color: #800080;">$obj1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> xxx\MyClass();
    </span><span style="color: #800080;">$obj1</span>-><span style="color: #000000;">myMethod();
}</span>
로그인 후 복사



OK
[源码下载]

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