Maison  >  Article  >  développement back-end  >  腾讯php程序员面试题-15个魔术方法的总结

腾讯php程序员面试题-15个魔术方法的总结

WBOY
WBOYoriginal
2016-07-25 08:59:19959parcourir
  1. 功能:在当前页使用类时自动加载该类的文件

  2. 参数$className 为类的名称 可自定义
  3. */

  4. function __autoload($className){

  5. $className=strtolower($className);//最好加上这一步,因为类首字母大写,某些系统区分文件名的大小写

  6. require("$className.class.php");//加载类文件 One.class.php Two.class.php与本文件在同一目录下

  7. echo '------------------------------
    ';//作为调用时的标记来测试

  8. }

  9. //以下两个类均未在本文件中定义

  10. $o=new One();//使用One类,对其初始化

  11. $t=new Two();//使用Two类,对其初始化

  12. ?>

复制代码

注意这个函数如果需要正常加载,需要将文件名设置成类名(推荐小写).class.php等类名和文件名有某种关联才可以,另外如果这个函数出现异常不能被Catch捕获,将会显示Fatal Error

2.__construct() 构造函数

在C#和PHP4中构造函数的函数名都是与类名相同,当然PHP5也支持这样(如果找不到__construct方法后会找函数名与类名相同的作为构造函数),之所以这样写的好处是如果我们想更改类的名字,我们就只改类名就可以,不用在更改构造函数的函数名,同时从某种程度上减少了我们出错的概率,示例代码还是简单写一下吧!

  1. class PcYoYo{

  2. private $url;

  3. function __construct($url){

  4. $this->url=$url;

  5. }

  6. }

  7. ?>

复制代码

3.__destruct() 析构函数

__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法

默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.

析构函数允许你在使用一个对象之后执行任意代码来清除内存.

当PHP决定你的脚本不再与对象相关时,析构函数将被调用.

在一个函数的命名空间内,这会发生在函数return的时候.

对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.

4.__call() 当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息

  1. //初始化一个类

  2. class Person{

  3. private $name;

  4. private $age;

  5. private $sex;

  6. function walk($hour,$minute){

  7. echo "$hour :$minute We will walk
    ";

  8. }

  9. function run(){

  10. }

  11. //使用魔术方法__call

  12. /*****

  13. 功能:在对象调用类中不存在的函数时自动调用,进行一些操作

  14. 参数:$proName 所调用函数名称 $args 参数数组 $proName ,$args 为自定义的形参可符合自己风格变动,但是这两个参数的意义是固定的

  15. *****/

  16. function __call($proName,$args){

  17. echo "The $proName doesn't exist! the parameters are";

  18. print_r($args);

  19. echo '
    ';

  20. }

  21. }// the end of class

  22. //实例化一个对象

  23. $p=new Person();

  24. //调用Person类中存在的方法

  25. $p->walk(5,39);

  26. //调用Person类中不存在的方法

  27. $p->work();//如果没有使用魔术方法__call,则程序发生错误,错误信息Fatal error: Call to undefined method Person::work() in D:/phpnow/htdocs/holiday/magic__call.php on line 29

  28. //如果使用了魔术方法__call,则在对象调用类中不存在的函数时,__call被自动调用,用来执行某些操作。

  29. ?>

复制代码

5.__clone()

该函数在对象克隆时自动调用,其作用是对克隆的副本做一些初始化操作

  1. //初始化一个类

  2. class Computer{

  3. //

  4. public $cpu='intel';

  5. private $monitor;

  6. private $keyboard;

  7. //设置魔术方法__clone()函数

  8. function __clone(){//如果不设置这个魔术方法那么克隆出来的就是一模一样的,__clone函数和类的构造函数类似都是做一些初始化操作

  9. $this->cpu='AMD';//$this指的是新创建的克隆对象

  10. }

  11. //设置析构函数,用来比较=和clone的区别

  12. function __destruct(){

  13. echo '*************************************
    ';

  14. }

  15. }// the end of the class

  16. //实例化一个对象

  17. $c1=new Computer();

  18. //使用引用的方法在添加一个引用,因为对象的引用是存放在内存中的栈内存中,如果按指针的说法,那么这样做就是在内存中有创建了一个指针指向$c1指向的对象

  19. //我们可以通过条用析构函数判断出来这样不是复制了对象

  20. $c2=$c1;

  21. //使用clone方法克隆一个对象

  22. $c3=clone $c1;

  23. //输出两者的信息比较

  24. echo $c1->cpu,'
    ';

  25. echo $c3->cpu,'
    ';

  26. ?>

复制代码

6.__get() 当所对象所调用的成员属性未声明或者级别为private或者protected等时,我们可以在这个函数里进行自己的一些操作

  1. class Person{

  2. private $name;

  3. public $nation;

  4. function __get($para){//必须有一个参数

  5. echo $para.'不存在';

  6. }

  7. }

  8. $p=new Person();

  9. $name=$p->name;//call the __get function

  10. $nation=$p->nation;//never call the __get function

  11. ?>

复制代码

7.__set() 当所对未声明或者级别为private或者protected等进行赋值时调用此函数,我们可以在这个函数里进行自己的一些操作

  1. class Pc{

  2. private $key;

  3. function __set($key,$value){//必须有两个参数一个是成员属性,另一个是值

  4. echo '对'.$key.'赋值为'.$value.'失败';

  5. }

  6. }

  7. $p=new Pc();

  8. $p->key=123;

  9. ?>

复制代码

1 2 下一页 尾页



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn