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


Posted in PHP onMay 06, 2016

PHP前言:

•动态地创建属性和方法

•对象的复制

•对象的比较

•加载指定的文件

•自动加载类文件

•命名空间

示例

1、类的相关知识点 3(动态地创建属性和方法)

class/class3.php

<?php
/**
* 类的相关知识点 3(动态地创建属性和方法)
*/
// 用于演示如何动态地创建属性(这就是 php 中所谓的重载)
class Class1
{
// __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数
public function __set($name, $value)
{
echo "__set \$name: {$name}, \$value: {$value}";
echo "<br />";
}
// __get 魔术方法,当获取的属性不存在或者不可访问(private)时就会调用此函数
public function __get($name)
{
echo "__get \$name: {$name}";
echo "<br />";
return 999;
}
}
$objClass1 = new Class1();
// 当你设置的属性不存在或者不可访问(private)时,就会调用对应的 __set 魔术方法
$objClass1->property1 = wanglei; // 不可访问的如 private ,或者不存在的
// 当你获取的属性不存在或者不可访问(private)时,就会调用对应的 __get 魔术方法
echo $objClass1->property2;
echo "<br />";
// 用于演示如何动态地创建方法(这就是 php 中所谓的重载)
class Class2
{
// __call 魔术方法,当调用的实例方法不存在或者不可访问(private)时就会调用此函数
public function __call($name, $arguments)
{
echo "__call \$name: {$name}, \$arguments: " . implode(', ', $arguments);
echo "<br />";
}
// __callStatic 魔术方法,当调用的类方法不存在或者不可访问(private)时就会调用此函数
public static function __callStatic($name, $arguments)
{
echo "__callStatic \$name: {$name}, \$arguments: " . implode(', ', $arguments);
echo "<br />";
}
}
$objClass2 = new Class2();
// 当你调用的实例方法不存在或者不可访问(private)时,就会调用对应的 __call 魔术方法
echo $objClass2->method1("aaa", "bbb");
// 当你调用的类方法不存在或者不可访问(private)时,就会调用对应的 __callStatic 魔术方法
echo Class2::method2("aaa", "bbb");

2、类的相关知识点 4(对象的复制,对象的比较)

class/class4.php

<?php
/**
* 类的相关知识点 4(对象的复制,对象的比较)
*/
// 用于演示如何复制对象
class Class1
{
public $field1 = "field1";
public $field2 = "field2";
// 通过 clone 复制对象时,会调用此魔术方法
function __clone()
{
echo "__clone";
echo "<br />";
}
}
$objClass1 = new Class1();
// 通过 clone 复制对象,会调用 __clone 魔术方法
$objClass2 = clone $objClass1;
// 通过 clone 复制的对象为浅拷贝(shallow copy),即成员数据之间的一一赋值, 而所有的引用属性仍然会是一个指向原来的变量的引用(如果要做 deep copy 则需要自己写)
echo $objClass2->field1; // output: field1
echo "<br />";
echo $objClass2->field2; // output: field2
echo "<br />";
// 如果两个对象的属性和属性值都相等,则他们“==”相等,
if ($objClass1 == $objClass2)
{
echo '$objClass1 == $objClass2';
echo "<br />";
}
// 如果两个对象的属性和属性值都相等,但不是同一个类的实例,则他们“===”不相等
if ($objClass1 !== $objClass2)
{
echo '$objClass1 !== $objClass2';
echo "<br />";
}
// 如果两个对象是同一个类的实例,则他们“===”相等
if ($objClass1 === $objClass1)
{
echo '$objClass1 === $objClass1';
echo "<br />";
}
// 如果两个对象是同一个类的实例,则他们“===”相等
$objClass3 = &$objClass1;
if ($objClass1 === $objClass3)
{
echo '$objClass1 === $objClass3';
echo "<br />";
}

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

class/class5.php

<?php
/**
* 类的相关知识点 5(加载指定的文件,自动加载类文件)
*/
/*
* 包含并运行指定文件,可以是绝对路径也可以是相对路径
* include 找不到的话则警告,然后继续运行(include_once: 在当前文件中只 include 指定文件一次)
* require 找不到的话则错误,然后终止运行(require_once: 在当前文件中只 require 指定文件一次)
* include '';
* require '';
* include_once '';
* require_once '';
*/
// 演示如何通过 __autoload 魔术方法,来实现类的自动加载
function __autoload($class_name)
{
// 加载指定的文件
require_once $class_name . '.class.php';
}
// 如果在当前文件中找不到 MyClass 类,那么就会去调用 __autoload 魔术方法
$obj = new MyClass();
echo $obj->name;
echo "<br />"; 
class/MyClass.class.php
<?php
class MyClass
{
public $name = "webabcd";
}

4、类的相关知识点 6(命名空间)

class/class6.php

<?php
/**
* 类的相关知识点 6(命名空间)
*/
// 以下代码仅用于演示,实际项目中不建议在一个文件中定义多个 namespace
// 如果当前文件中只有一个命名空间,那么下面的这段可以省略掉命名空间的大括号,直接 namespace MyNamespace1; 即可
namespace MyNamespace1
{
const MyConst = "MyNamespace1 MyConst";
function myFunction()
{
echo "MyNamespace1 myFunction";
echo "<br />";
}
class MyClass
{
public function myMethod()
{
echo "MyNamespace1 MyClass myMethod";
echo "<br />";
}
}
}
// 定义命名空间时,可以指定路径
namespace Sub1\Sub2\MyNamespace2
{
const MyConst = "MyNamespace2 MyConst";
function myFunction()
{
echo "MyNamespace2 myFunction";
echo "<br />";
}
class MyClass
{
public function myMethod()
{
echo "MyNamespace2 MyClass myMethod";
echo "<br />";
}
}
}
namespace MyNamespace3
{
// 调用指定命名空间中的指定常量
echo \MyNamespace1\MyConst;
echo "<br />";
// 调用指定命名空间中的指定函数
\MyNamespace1\myFunction();
// 实例化指定命名空间中的类
$obj1 = new \MyNamespace1\MyClass();
$obj1->myMethod();
}
namespace MyNamespace4
{
// use 指定的命名空间
use \Sub1\Sub2\MyNamespace2;
// 之后不用再写全命名空间的路径了,因为之前 use 过了
echo MyNamespace2\MyConst;
echo "<br />";
MyNamespace2\myFunction();
$obj1 = new MyNamespace2\MyClass();
$obj1->myMethod();
}
namespace MyNamespace5
{
// use 指定的命名空间,并为其设置别名
use \Sub1\Sub2\MyNamespace2 as xxx;
// 之后再调用命名空间时,可以使用其别名
echo xxx\MyConst;
echo "<br />";
xxx\myFunction();
$obj1 = new xxx\MyClass();
$obj1->myMethod();
}

以上所述是小编给大家介绍的PHP动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 的相关介绍,希望对大家有所帮助!

PHP 相关文章推荐
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
PHP代码优化的53个细节
Mar 03 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
php使用curl通过代理获取数据的实现方法
May 16 PHP
php删除数组指定元素实现代码
May 03 PHP
PHP实现文件上传功能实例代码
May 18 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 #PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 #PHP
PHP图片加水印实现方法
May 06 #PHP
php数组冒泡排序算法实例
May 06 #PHP
PHP中子类重载父类的方法【parent::方法名】
May 06 #PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 #PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 #PHP
You might like
五个PHP程序员工具
2008/05/26 PHP
php继承的一个应用
2011/09/06 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
Python各种扩展名区别点整理
2020/02/27 Python
keras的三种模型实现与区别说明
2020/07/03 Python
Python如何测试stdout输出
2020/08/10 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
历史专业个人求职信分享
2013/12/20 职场文书
人事专员岗位说明书
2014/07/29 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang