1. php面向对象有哪些魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(),__invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。
2. php魔术方法。。
在 PHP 里,将所有以 __(两个下划线)开头的类方法保留为魔术方法,所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
魔术方法的引入是对面向对象编程思想的进一步实现,重载就是通过魔术方法来实现的。
PHP 魔术方法主要有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等。
最常见的是__construct(), __destruct(),__get(), __set()等:
__construct和__destruct是类的构造函数和析构函数。
3. php5中魔术方法函数有哪几个,请举例说明各自的用法
__construct() :实例化对象时被调用;
__destuct():当删除一个对象或者对象操作终止是被执行;
__call():调用对象不存在方法时被调用;
__get():调用对象不存在的属性时被调用;
__set():设置对象不存在的属性时被调用;_
_toString():打印一个对象时被调用,比如echo $obj,print($obj);
__clone():克隆对象时被调用,比如$t = new Test();$tt = clone $t;
__sleep():serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法;
__wakeup():unserialize之前被调用,做些对象的初始化;
__isset():检测对象是否存在属性的时候被调用,如 isset($c->name);
__unset():unset一个对象属性时被调用,如:unset($c->name);
__set_state():调用var_export时被调用,用__set_state的返回值作为 var_export的返回值;,
__autoload():实例化一个对象时,如果对应的类不存在,在该方法被调用。
希望你能采纳,谢谢。
4. php魔术方法怎么用
在 PHP 里,将所有以 __(两个下划线)开头的类方法保留为魔术方法。魔术方法的引入是对面向对象编程思想的进一步实现,重载就是通过魔术方法来实现的。主要有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),__sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等函数。
5. php中常用的魔术方法有哪些
php规定以两个下划线__开头的方法都保留为魔术方法,建议自定义函数的函数名最好避开。
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。
6. php5 中魔术方法函数有哪几个
魔术函数:
9.3 构造函数:__construct()
9.3.1 实例化对象时被调用。
9.3.2 在类中,构造函数是用来初始化对象的,利用构造函数,可以操作对象,并改变它的值。
9.3.3 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
9.3.4 当子类重写了构造函数,子类被实例化时,只调用子类的构造函数,而父类的构造函数不被调用。
9.4 析构函数:__destruct()
9.4.1 当删除一个对象或对象操作终止时被调用。
9.4.2 当该对象的所有引用都被删除,或者对象被显式销毁时执行。
9.5 克隆函数:__clone()
9.5.1 当对象被拷贝(克隆)时直接调用。
9.5.2 如$a = new Action(); $a = $object;
9.6 __set($name, $value)
9.6.1 用$object->a = 17的方式给属性赋值时,如果属性a存在且是public型,那么直接给属性a赋值皆可;
9.6.2 如果属性a不存在或者是protected/private型,就会调用__set($name, $value)方法。
9.6.3 二个参数:属性、属性值。
9.7 __get($name)
9.7.1 用$object->a的方式读取对象的属性时,如果属性a存在且是public型,那么直接返回该属性的值;
9.7.2 如果属性a不存在或者是protected/private修饰的不可直接访问的类型,就会调该方法并以返回值为准。
9.7.3 一般可以使用该方法使外部可限制性地访问内部属性,或者完成类似java中的反射操作。
9.8 __isset($name)
9.8.1 检测一个对象的属性是否存在时被调用。
9.8.2 如:isset($c->name),如果name不存在,则触发该函数。
9.8.3 对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用。
9.9 __unset($name)
9.9.1 销毁一个对象的属性时被调用。
9.9.2 如:unset($c->name),如果name不存在,则触发该函数。
9.9.3 当unset一个不存在或者不可访问的属性时,__unset()会被调用,否则直接unset该属性皆可。
9.10 __call($name, $arguments)
9.10.1 当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。
9.11 __callStatic($name, $arguments)
9.11.1 当在静态方法中调用不存在或者不可访问的方法时,会调用__callStatic($name, $arguments)方法。
9.11.2 这个方法 是PHP5.3里才添加的,比较新。
9.12 __toString()
9.12.1 当打印对象时会被直接调用。如 echo $object; 或 print $obj;
9.12.2 注意:这时候php会抛出一个Catchable fatal error错误;用print_r打印对象不会触发此函数。
9.13 __set_state()
9.13.1 用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。
9.13.2 注:var_export()和var_mp()类似,只是var_export()输出的内容符合php语法。
9.14 __autoload($name)
9.14.1 实例化一个对象时,如果对应的类不存在,则该方法被调用。
9.14.2 这个函数比较特殊,这个函数并不是作为类的成员方法使用的。
9.14.3 注意:该方法是全局函数,参数是类的名称。
9.14.4 可以用spl_autoload_register函数来定义其他的函数来代替__autoload
9.15 __sleep()
9.15.1 serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9.16 __wakeup()
9.16.1 unserialize时被调用,做些对象的初始化工作。
7. php什么是魔术方法
__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__sleep(),
__wakeup(),
__toString(),
__invoke(),
__set_state(),
__clone()
和
__debugInfo()
等方法在
PHP
中被称为"魔术方法"(Magic
methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
8. PHP魔术方法__GET、__SET使用实例
__get()-
读取不可访问属性的值时,__get()
会被调用。
__set()-
在给不可访问属性赋值时,__set()
会被调用。
复制代码
代码如下:
<?php
/**
*
清晰的认识__get()
__set()
*/
class
Example
{
//公有的属性
public
$public
=
'pub'
;
//受保护的
-
子类中该属性可用
protected
$protected
=
'pro';
//私有的
-
只能此类使用此属性
private
$private
=
'pri';
//当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法
public
function
__get($name){
return
'调用__get()方法:'.$name;
}
//当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法
public
function
__set($name,$value){
echo
"\nname:".$name.',value:'.$value."\n";
}
}
$example
=
new
Example;
echo
'<pre>';
echo
$example->public."\n";
echo
$example->protected."\n";
echo
$example->private."\n";
echo
$example->other."\n";
echo
'<hr>';
$example->public
=
'lic';
//这个赋值成功所有没有显示
$example->protected
=
'tec';
$example->private
=
'vat';
$example->other
=
'er';
echo
'<br/>';
echo
'打印
public
属性:'.$example->public;
9. php魔术方法__tostring
__tostring()方法:在直接输出对象引用的时候,就不会产生错误,而是自动调用了__tostring()方法,输出__tostring()方法中返回的字符串
通俗来说就是 对象一般是使用print_r() 或 var_mp() 来打印访问
但对于一般闲的人来说直接 使用 echo 输出对象时,必定会报错的,原因是对象无法使用echo的。
这个时候如果想解决这个错误,咱们应该怎么操作呢?
可以很好的利用__tostring()这个魔术方法
但是切记使用__toString() 时返回值一定要使用return 来进行返回。
<?php
header("content-type:text/html;charset=utf-8");
class demo{
public $foo;
public function __construct($foo){
$this->foo=$foo;
}
//定义一个__toString()方法时,返加一个成员属性$foo
public function __toString(){
return $this->foo;
}
}
$demo=new demo('hello PHP成员');
echo $demo;
10. PHP __get和__set魔术方法在面向对象中的使用问题
php的面向对象思想编程中声明方法有三种不同的权限:public protect private。
public:权限是最大的,可以内部调用,实例调用等。
protected: 受保护类型,用于本类和继承类调用。
private: 私有类型,只有在本类中使用。
这些权限同样可以应用在变量声明中。
__set __get 都是php的魔术方法,主要是为了用来改变类的私有属性用的。
你觉得麻烦可以将private私有的变量改为公共public变量,这个要看需求和个人对面向对象的思考。
追问 : 我想知道的是(用private封装然后用__set或者__get )和(public设置类的属性)有什么不同.都可以取值赋值.
追答 : 没什么不同的,实现的效果都一样,只是private是为了限制访问入口少一些,或者之前用private时没有考虑到有如今的调用情况,所以在加了set或get。 比较public是所有人都可以访问,private是内部人可以访问,从权限来看,private会安全一些。