首页 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 Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)