php中常见的魔术方法,PHP中常见魔术方法解析

class info {

private $province; //省

public $city; //城市

private $myname; //姓名

//__construct()方法到实例化时自动加载function

function __construct() {

echo "实例化我就起作用
";

$this->myname("Steven");

}

//__call()方法用来获取没有定义的function

function __call($name, $param) {

echo $name."这个方法没有定义,跑到我这儿来了
";

print_r($param) ;

echo "
";

}

//定义一个方法 ,即普通的定义方法

function myname($param) {

echo "定义过的就到定义过的这儿来,$param
";

return $this->myname = $param;

}

//__get()得到私有变量值

private function __get($name) {

if (isset ($this-> $name)) {

return ($this-> $name);

} else {

return false;

}

}

//__toString()

private function __toString() {

echo '你输入的这个类的名子叫'.__CLASS__."
";

return __CLASS__;

}

//__set()方法用来设置私有变量值

private function __set($name, $value) {

echo "设置私有变量时,自动调用了这个__set()方法为私有变量赋值
";

$this-> $name = $value;

}

//__isset()方法判断私有变量值

private function __isset($name) {

echo "isset()函数判断私有变量是不是被定义时,自动调用__isset()
";

return isset ($this-> $name);

}

//__unset()方法删除私有变量值

private function __unset($name) {

echo "unset()函数删除一个私有变量时,自动调用__unset()
";

unset ($this-> $name);

}

//__destruct()删除类对象时自动会调用

public function __destruct() {

echo '删除类对像,就到__destruct()这儿来
';

}

}

$info = new info(); //会调用__construct()方法和__destruct()方法

$info->province = "陕西"; //会调用__set()方法

$info->city = "西安"; //不会调用__set()方法

$info->myname("Steven"); //会调用myname()方法

$info->nickname("peng"); //会调用__call()方法

(string)$info; //会调用__toString()方法

var_dump(isset ($info->province)) . "
"; //会调用__isset()方法和__get()方法

echo $info->province . "
"; //会调用__get()方法

unset ($info->province); //会调用__unset()方法

echo $info->province; //已经被删除了, 所以不会显示为安徽了,会调用__isset()方法

?>

结果:

实例化我就起作用

定义过的就到定义过的这儿来,Steven

设置私有变量时,自动调用了这个__set()方法为私有变量赋值

定义过的就到定义过的这儿来,Steven

nickname这个方法没有定义,跑到我这儿来了

Array ( [0] => peng )

你输入的这个类的名子叫info

isset()函数判断私有变量是不是被定义时,自动调用__isset()

bool(true) 陕西

unset()函数删除一个私有变量时,自动调用__unset()

isset()函数判断私有变量是不是被定义时,自动调用 __isset()

删除类对像,就到__destruct()这儿来

总结:

1,__set(),__get(),__isset(),__unset()可以归于一类,对于私有变量的赋值,取值,判断,删除操作。以赋值为例,$province是私有变量,$city是全局变量,赋值的时候,$province调用了__set()方法,而$city却没有调用__set()这个方法

2,__construct()构造函数,__destruct()析构函数,他们二个都是实例化类的时候就会产生,有一点不同,构造在最前面,析构函数在最后面。

3,当你调用了一个class中没有的方法时,肯定会报fatal error,如果有了__call()函数,就不会报错了。$info->nickname("tank");class中并没有这个方法,但是他没有报错。传的参数是字符串,__call会把他转成数组。Array ( [0] => tank )

4,(string)$info;把$info这个obj强制转成字符串,从表面意思看是这个,但是实际上是调用__toString()的方法。

附几个PHP 的魔术常量:

__LINE__

文件中的当前行号。

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =

__FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

__METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

PHP中的常见魔术方法功能作用及用法实例

概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. 开始之前 在总结 ...

OpenStack安装部署管理中常见问题解决方法

一.网络问题-network 更多网络原理机制可以参考. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...

PHP中的面向对象OOP中的魔术方法

一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在ne ...

巧用PHP中__get()魔术方法

PHP中的魔术方法有很多,这些魔术方法可以让PHP脚本在某些特定的情况下自动调用.比如 __construct() 每次实例化一个类都会先调用该方法进行初始化.这里我们讲一下__get() 魔术方法的 ...

PHP中的魔术方法和关键字

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

JS基础语法---Date对象中常见的方法

创建实例对象 var dt = new Date(); //当前的时间---当前的服务器 console.log(dt); var dt = new Date("2017-08-12&quo ...

Web安全测试中常见逻辑漏洞解析(实战篇)

Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

随机推荐

第六章、Struts2数据校验

一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...

python函数式编程

函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”. 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数 ...

c#不重复的排序方法

public int getRandom(int num) { Thread.Sleep(5); // Random ro = new Random(unchecked((int)DateTime.N ...

[Script]EBS里查看模块的版本、文件的版本信息【Z】

系统版本信息 装了哪些模块,以及版本信息 select 'Current Application Release: '||ver||' ('||bug||')' "Description&q ...

SQL Server save transaction

准备: create table Nums(X int); 目的:只向表中插入一行. --------------------------------------------------------- ...

三十三、ajaxFileUpload图片上传

$.ajaxFileUpload({ url : "api/upload/filesUpload", secureuri : false, //一般设置为false fileEle ...

TypeScript学习(2)

自己动手敲代码的重要性不用多说.敲代码自然是参考TypeScript官方中文文档.编辑器推荐使用Visual Studio Code. Visual Studio Code 更新 更新完成之后很可能会 ...

matlab颜色映射colormap() pcolor()

http://blog.csdn.net/qq_20823641/article/details/51711618

启动Jupyter Notebook

按照图所示,在命令下输入ipython notebook 即可启动Jupyter. 启动后的效果:

android 开源组件合集-UI篇(2013-11-07更新)

其实也算不上合集,只是将我经常用到的部分整理一下,如果您有好东西,也可以留言补充 1.actionbar http://actionbarsherlock.com/ https://github.co ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值