Blogger Information
Blog 33
fans 0
comment 0
visits 49704
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 常用魔术方法
Lon
Original
1134 people have browsed it

PHP 常用魔术方法

一、 __construct(),类的构造函数

php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。

1、 构造方法的作用

通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。

2、 构造方法的在类中的声明格式

  1. function __constrct([参数列表]){
  2. 方法体 //通常用来对成员属性进行初始化赋值
  3. }

在类中声明构造方法需要注意的事项:
1、在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。
2、构造方法名称是以两个下画线开始的__construct()

  1. <?php
  2. class Student{
  3. public $name;
  4. public $age = 18;
  5. //显示声明一个构造方法且带参数
  6. public function __construct($n,$age){
  7. $this->name = $n;
  8. $this->age = $age;
  9. }
  10. public function info(){
  11. echo '我是:'.$this->name.' 今年:'.$this->age;
  12. }
  13. }
  14. $obj = new Student('张三',20);
  15. $obj->info();

二、__destruct(),类的析构函数

析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。

析构方法是PHP5才引进的新内容,与构造方法对应

析造方法的声明格式与构造方法 __construct() 比较类似,也是以两个下划线开始的方法 __destruct() ,这种析构方法名称也是固定的。

1、 析构方法的声明格式

  1. function __destruct(){
  2. //方法体
  3. }

注意:析构函数不能带有任何参数。

2、 析构方法的作用

一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。

  1. <?php
  2. class Student{
  3. public $name;
  4. public $age = 18;
  5. //显示声明一个构造方法且带参数
  6. public function __construct($n,$age){
  7. $this->name = $n;
  8. $this->age = $age;
  9. }
  10. public function info(){
  11. echo '我是:'.$this->name.' 今年:'.$this->age.'<br>';
  12. }
  13. //析构函数
  14. public function __destruct(){
  15. echo "销毁 " . $this->name . "<br>";
  16. }
  17. }
  18. $obj = new Student('张三',20);
  19. $obj->info();

三、 __call(),在对象中调用一个不可访问方法时调用。

该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $arguments 则以数组的方式接收不存在方法的多个参数。

1、 __call()方法的格式:

  1. function __call(string $function_name, array $arguments){
  2. // 方法体
  3. }

2、 __call() 方法的作用:

为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call()方法来避免。

该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当访问不存在或不可访问的方法时,魔术方法__call()自动调用
  7. // 参数:$func是传递过来的方法名称,$arrs是传递过来的参数数组
  8. public function __call($func,$arrs){
  9. echo "方法{$func}(".implode(',', $arrs).")不存在或不可访问!";
  10. }
  11. }
  12. //创建学生类对象
  13. $obj = new Student();
  14. // 调用对象中不存在的方法,则自动调用了对象中的__call()方法
  15. $obj->showInfo("张三",24);

四、 __callStatic(),用静态方式中调用一个不可访问方法时调用

此方法与上面所说的 call() 功能除了 callStatic() 是未静态方法准备的之外,其它都是一样的。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. //用静态化方式访问不存在或不可访问的方法时,魔术方法__callStatic()自动调用
  7. //参数:$func是传递过来的方法名称,$args是传递过来的参数数组
  8. public static function __callStatic($func,$args)
  9. {
  10. echo "方法{$func}(".implode(',',$args).")不存在或不可访问!";
  11. }
  12. }
  13. //用静态化方法调用showInfo()方法
  14. Student::showInfo('张三',24,'男');

五、 __get(),获得一个类的成员变量时调用

在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()

魔术方法__get()的作用:
在程序运行过程中,通过它可以在对象的外部获取私有成员属性的值。

  1. <?php
  2. class Student{
  3. // 私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当访问不可访问是属性时,__get()魔术方法会自动调用
  7. public function __get($n){
  8. return $this->$n;
  9. }
  10. }
  11. // 创建学生类对象
  12. $obj = new Student();
  13. // 访问私有的属性
  14. echo "{$obj->name}的年龄是{$obj->age}岁";
  15. ?>

六、 __set(),设置一个类的成员变量时调用

__set( $property, $value ) 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

  1. <?php
  2. class Student{
  3. // 私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当给不可访问的属性赋值时,__set()魔术方法自动调用
  7. public function __set($n,$v){
  8. $this->$n = $v;
  9. }
  10. }
  11. // 创建学生类对象
  12. $obj = new Student();
  13. // 修改私有属性
  14. $obj->name = '李四';
  15. $obj->age = 22;
  16. var_dump($obj);
  17. ?>

七、 __isset()

__isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset()会被调用。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当对不可访问的属性应用isset()或者empty()时,__isset()会自动调用
  7. public function __isset($n){
  8. return isset($this->$n);
  9. }
  10. }
  11. // 创建学生类对象
  12. $obj = new Student();
  13. // 判断私有属性是否存在
  14. if(isset($obj->name)){
  15. echo "存在";
  16. }else{
  17. echo "不存在或不可访问";
  18. }
  19. ?>

八、 __unset(),当对不可访问属性调用unset()时被调用。

在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。

  1. <?php
  2. class Student{
  3. //私有的成员属性
  4. private $name = "张三";
  5. private $age = 24;
  6. // 当对私有的属性应用unset()时,魔术方法__unset()自动调用
  7. public function __unset($n){
  8. unset($this->$n);
  9. }
  10. }
  11. //创建学生类对象
  12. $obj = new Student();
  13. // 删除对象属性
  14. unset($obj->name);
  15. var_dump($obj);
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post