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

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

WBOY
WBOYオリジナル
2016-05-20 10:14:541192ブラウズ

[源码下载]


速战速决 (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 までご連絡ください。