作者: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
[源码下载]