基于PHP5魔术常量与魔术方法的详解

魔术常量:
1。__LINE__
返回文件中的当前行号。
2。__FILE__
  返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP4.0.2 起,__FILE__总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__
  返回函数名称(PHP4.3.0 新加)。自PHP5 起本常量返回该函数被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。
4。__CLASS__
  返回类的名称(PHP4.3.0 新加)。自PHP5 起本常量返回该类被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。
5。__METHOD__
  返回类的方法名(PHP5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
魔术函数:
1。__construct()
  构造函数: 实例化对象时被调用,
  当__construct和以类名为函数名的构造函数同时存在时,__construct将被调用,另一个不被调用。
4。__get()
  读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。
5。__set()
  设置一个对象的属性时,
  若属性存在,则直接赋值;
  若不存在,则会调用__set函数。
6。__toString()
  打印一个对象的时被调用。如echo$obj;或print$obj;
7。__clone()
  克隆对象时被调用。如:$t=newTest();$t1=clone $t;
8。__sleep()
  serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9。__wakeup()
  unserialize时被调用,做些对象的初始化工作。
10。__isset()
  检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11。__unset()
  unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state()
  调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13。__autoload()
  实例化一个对象时,如果对应的类不存在,则该方法被调用。

初识魔术方法
Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。
PHP| 魔术方法|__toString(),__clone(),__call(),__autoload() 详解
__toString()
如果我有一个类:
classPerson
{
private $name = “”;
private $age = 0;
function__construct($name = “”, $age = “”)
{
$this->name =$name;
$this->age = $age;
}
functionsay()
{
echo“name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”;  
}
}
现在我去实例化这个类,然后去打印这个实例:
$p1= new person(“liuzy”,20);
echo $p1;  //直接打印会出错
显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印。这时,我们可以用到__toString()方法。我们在Person类里加一个__toString()方法:
function__toString()
{
return “I am  Person,my name is“.$this->name.”<br/>”;
}
然后再刷新页面,发现什么了?
现在我们明白,__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息。注意:是两个下划线,方法必须有返回值。
__clone()
我们知道对象是可以直接赋值的,比如
$p2= $p1;   //这里是一个对象有两个引用
那么我执行:
$p1->say();
$p2->say();
是都可以执行的,而且效果一样。

我们还有一种方法:
$p3= clone $p1;    //注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象。
同时我们在类里加入一个方法:
function__clone()
{
$this->name = “我是副本”; //注意:这里的$this是克隆产生的对象本身,不是当前类
}
然后我们执行:
$p3->say();
打印出:
name:我是副本
age:20
到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本进行属性初始化等操作。
__call()
这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法。注意需要提前在类里声明:
function__call($fname,$argus)
{
echo “你调用的方法:”.$fname.”不存在<br/>”;
echo“参数是”.print_r($argus);
}
__autoload()
我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include“xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include“xxx.php”。显然这样很麻烦。
__autoload()方法可以帮我们解决这个问题。

比如我们将上面的那个Person类所在的文件定义为Person_class.php ,
再新建一个php文件 test.php,编辑内容:
function __autoload($calssName)
{
include $className.”_class.php”; //看到这也许你就明白了吧?哈哈
}
$p= new Person(“mifan”, 22);
$p->say();
这样执行该test.php页面就不会出现错误了。
__autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名。
当然,类文件的命名也是很有讲究的。最好是和类有关系,比如Person_class.php

(0)

相关推荐

  • PHP的魔术常量__METHOD__简介

    __METHOD__ 是PHP5之后新增的魔术常量,表示的是类文法的名称.魔术常量是一种PHP预定义常量,它的值可以是变化的,PHP中的其它已经存在的魔术常量有__LINE__.__FILE__.__FUNCTION__.__CLASS__等. 下面就用一小段代码来演示一下__METHOD__的用法. <?php class chhua{ function test(){ echo __METHOD__; } } $e=new chhua(); $e->test();//输出:chhua::t

  • PHP 中魔术常量的实例详解

    PHP 中魔术常量的实例详解 本文介绍下,php编程中的魔术常量,掌握并灵活应用这些方法与常量,对于提高php的编程水平,有很大的帮助.有需要的朋友参考学习下. 魔术常量: namespace ns1; class Test { function __construct() { var_dump(__LINE__); var_dump(__FILE__); var_dump(__DIR__); var_dump(__FUNCTION__); var_dump(__CLASS__); var_du

  • php 魔术常量详解及实例代码

    php 魔术常量详解 实例: class MoShu{ public function moshu() { echo '当前类名:' . __CLASS__ . "<br />"; echo '当前方法名:' . __FUNCTION__ . "<br />"; echo '当前文件中所在的行数:' . __LINE__ . "<br />"; echo '当前文件绝对路径:' . __FILE__ . &qu

  • PHP中几个常用的魔术常量

    有七个魔术常量它们的值随着它们在代码中的位置改变而改变.例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: 名称 说明 __LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径. __DIR__ 文件所在的目录.如果用在被包括文件中,则返回

  • PHP 预定义变量、魔术常量和魔术方法功能与用法小结

    本文总结了PHP 预定义变量.魔术常量和魔术方法.分享给大家供大家参考,具体如下: PHP 预定义了一些变量.常量.方法,使用起来很方便,例如直接使用 __DIR__ 获取当前文件所在的目录. 下面分别详细介绍一下 PHP 的预定义变量.魔术常量和魔术方法 预定义变量 超全局变量: 超全局变量是在全部作用域中始终可用的内置变量,意味这你可以在 PHP 脚本的任意位置直接访问.在函数或方法中无需执行 global $variable; 就可以访问它们. 超全局变量是从 PHP 4.1.0 开始才有

  • 基于JQuery的Ajax方法使用详解

    如下所示: $.ajax的主要参数: url: '_请求的地址', type: 请求类型 get & post data: '请求的参数, success:回调函数 $.ajax({ url: '_api/01.check.php', type: 'get', data: 'name=' + $('inputName').val(), success: function (data) { console.log(data); } } }) jQuery的一些属性: $('xx').find('x

  • 基于Axios 常用的请求方法别名(详解)

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 常用的请求方法别名一般有: Get/post/http协议请求 执行Get请求 function get(){ return axios.get('/data.json', { params:{ id:1234 } }).then(function (response) { console.log(response); }) .catch(function (error) { console.log

  • PHP基于phpqrcode类生成二维码的方法示例详解

    HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.sourceforge.net/ 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中 参数$text表示生成二位的的信息文本: 参数$outfile表示是否输出二维码图片 文件,默认否: 参数$level表示容错率,

  • PHP中Closure类的使用方法及详解

    Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. Closure 类(PHP 5 >= 5.3.0)简介 用于代表 匿名函数 的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,下面我们来看一下PHP Closure类的使用方法及介绍. PHP Closure类之前在PHP预定义接口中介绍过,但它可不是interface哦,它是一个内部的final类.Clo

  • 基于String变量的两种创建方式(详解)

    在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc")://第二种方式 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址. 第二种方式创建String变量时,在堆中创建一个存放&q

  • 基于使用paramiko执行远程linux主机命令(详解)

    paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件. 关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上做一些封装,便于扩展与编写脚本. 下面直接给出代码: # coding: utf-8 import paramiko import re from time import sleep # 定义一个类,表示一台远端linux主机 class Linux(object): # 通过IP, 用户名,密码,

  • 基于Bootstrap3表格插件和分页插件实例详解

    首先看下实现效果图,如果觉得还不错,请参考实现代码. 上面数据 下面分页 使用方法 1 导入bootstrap的css <link rel="stylesheet" href="css/v3/bootstrap.min.css"> 2 导入jquery <script src="js/jquery-1.10.1.min.js" type="text/javascript"></script>

  • 基于js中this和event 的区别(详解)

    今天在看javascript入门经典-事件一章中看到了 this 和 event 两种传参形式.因为作为一个初级的前端开发人员平时只用过 this传参,so很想弄清楚,this和event的区别是什么,什么情况下用什么比较合适. onclick = changeImg(this)       vs     onclick = changeImg(event) <img src='usa.gif' onclick="changeImg(event)" /> <scrip

  • Kotlin 语言中调用 JavaScript 方法实例详解

    Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

随机推荐