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

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

WBOY
WBOYOriginal
2016-05-20 10:14:541191browse

[源码下载]


速战速决 (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
[源码下载]

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn