奥门新浦京官方网站PHP魔术方法和魔术常量介绍及使用

有些东西风姿洒脱旦不是日常利用,十分轻便忘记,举例魔术点子和魔术常量。

PHP中把以四个下划线__千帆竞发的艺术称为魔术点子,这一个措施在PHP中出任了重大的效果。
魔术点子富含:

魔术点子(Magic methods)

PHP中把以七个下划线__始发的章程称为魔术点子,这个方式在PHP中当作了主要的功能。
魔术点子包罗:

  • __construct(),类的构造函数
  • __destruct(),类的析构函数
  • __call(),在目的中调用叁个不得访谈方法时调用
  • __callStatic(),用静态方式中调用贰个不可访谈方法时调用
  • __get(),得到一个类的积极分子变量时调用
  • __set(),设置二个类的积极分子变量时调用
  • __isset(),当对不可访问属性调用isset()empty()时调用
  • __unset(),当对不可访谈属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这些函数
  • __wakeup(),执行unserialize()时,先会调用这些函数
  • __toString(),类被当成字符串时的答疑方法
  • __invoke(),调用函数的秘技调用多少个目的时的对答方法
  • __set_state(),调用var_export()导出类时,此静态方法会被调用。
  • __clone(),当对象复制作而成功时调用

__construct(卡塔尔国,类的布局函数 __destruct(卡塔尔国,类的析构函数
__call(卡塔尔,在对象中调用一个不行访问方法时调用
__callStatic(卡塔尔,用静态情势中调用一个不行访问方法时调用
__get(卡塔尔,得到三个类的分子变量时调用
__set(卡塔尔国,设置三个类的分子变量时调用 __isset或empty()时调用
__unset时被调用。 __sleep时,先会调用那一个函数
__wakeup时,先会调用那一个函数
__toString(State of Qatar,类被当成字符串时的答复方法
__invoke(State of Qatar,调用函数的艺术调用二个目的时的回应方法
__set_state导出类时,此静态方法会被调用。
__clone(卡塔尔,当指标复制作而成功时调用

__construct()__destruct()

布局函数和析构函数应该不面生,他们在目的成立和消亡时被调用。比如大家需求开垦多少个文本,在指标创制时展开,对象消亡时关闭

<?php 
class FileRead
{
    protected $handle = NULL;

    function __construct(){
        $this->handle = fopen(...);
    }

    function __destruct(){
        fclose($this->handle);
    }
}
?>

那五个方法在后续时能够扩充,举个例子:

<?php 
class TmpFileRead extends FileRead
{
    function __construct(){
        parent::__construct();
    }

    function __destruct(){
        parent::__destruct();
    }
}
?>

__construct

__call()__callStatic()

在指标中调用二个不行访谈方法时会调用那七个章程,前面一个为静态方法。那四个措施咱们在可变方法(Variable
functions)调用中恐怕会用到。

<?php
class MethodTest 
{
    public function __call ($name, $arguments) {
        echo "Calling object method '$name' ". implode(', ', $arguments). "n";
    }

    public static function __callStatic ($name, $arguments) {
        echo "Calling static method '$name' ". implode(', ', $arguments). "n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
?>

布局函数和析构函数应该不生分,他们在目的创制和消失时被调用。举个例子大家须求开发一个文本,在指标成立时展开,对象消亡时关闭

__get()__set()__isset()__unset()

当get/set一个类的分子变量时调用那几个函数。比如大家将目的变量保存在其余二个数组中,并不是目的自己的分子变量

<?php 
class MethodTest
{
    private $data = array();

    public function __set($name, $value){
        $this->data[$name] = $value;
    }

    public function __get($name){
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
    }

    public function __isset($name){
        return isset($this->data[$name])
    }

    public function unset($name){
        unset($this->data[$name]);
    }
}
?>
handle = fopen; } function __destruct(){ fclose; }}?>

__sleep()__wakeup()

当大家在实施serialize()unserialize()时,会先调用这三个函数。比如大家在连串化贰个对象时,那些目的有二个数据库链接,想要在反体系化中平复链接状态,则能够通过重构那多个函数来达成链接的过来。例子如下:

<?php
class Connection 
{
    protected $link;
    private $server, $username, $password, $db;

    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }

    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }

    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
?>

那多个方法在继续时能够扩充,举例:

__toString()

对象便是字符串时的对答方法。举个例子利用echo $obj;来输出二个指标

<?php
// Declare a simple class
class TestClass
{
    public function __toString() {
        return 'this is a object';
    }
}

$class = new TestClass();
echo $class;
?>

其生机勃勃法子只可以回去字符串,何况不可能在此个点子中抛出十一分,不然会并发致命错误。

__call

__invoke()

调用函数的措施调用四个指标时的答应方法。如下

<?php
class CallableClass 
{
    function __invoke() {
        echo 'this is a object';
    }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

在目的中调用叁个不足访谈方法时会调用那五个法子,前者为静态方法。这一个法子大家在可变方法调用中大概会用到。

__set_state()

调用var_export()导出类时,此静态方法会被调用。

<?php
class A
{
    public $var1;
    public $var2;

    public static function __set_state ($an_array) {
        $obj = new A;
        $obj->var1 = $an_array['var1'];
        $obj->var2 = $an_array['var2'];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
var_dump(var_export($a));
?>
runTest;MethodTest::runTest;?>

__clone()

当对象复制作而成功时调用。举例在设计形式精解及PHP实现:单例格局一文中涉及的单例形式达成格局,利用这一个函数来防御对象被克隆。

<?php 
public class Singleton {
    private static $_instance = NULL;

    // 私有构造方法 
    private function __construct() {}

    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    // 防止克隆实例
    public function __clone(){
        die('Clone is not allowed.' . E_USER_ERROR);
    }
}
?>

__get和__unset()

魔术常量(Magic constants卡塔尔国

PHP中的常量超过四分之生机勃勃都以不改变的,可是有8个常量会趁机他们所在代码地方的变动而改换,那8个常量被称呼魔术常量。

  • __LINE__,文件中的当前进号
  • __FILE__,文件的总体路线和文件名
  • __DIR__,文件所在的目录
  • __FUNCTION__,函数名称
  • __CLASS__,类的名目
  • __TRAIT__,Trait的名字
  • __METHOD__,类的主意名
  • __NAMESPACE__,当前定名空间的称谓

那些魔术常量平时被用于获取当前情状新闻依旧记录日志。

当get/set叁个类的分子变量时调用那五个函数。举例大家将对象变量保存在其余一个数组中,实际不是指标自己的分子变量

data[$name] = $value; } public function __get{ if(array_key_exists return $this->data[$name]; return NULL; } public function __isset{ return isset } public function unset{ unset; }}?>

__sleep

当大家在实施serialize时,会先调用那多少个函数。比如大家在连串化二个对象时,这一个指标有三个数据库链接,想要在反类别化中平复链接状态,则足以通过重构这五个函数来促成链接的上涨。例子如下:

server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function __sleep() { return array('server', 'username', 'password', 'db'); } public function __wakeup; }}?>

__toString()

对象正是字符串时的答疑方法。比方利用echo $obj;来输出一个对象

其风度翩翩措施只可以回来字符串,並且不能在这里个艺术中抛出拾壹分,不然会冒出致命错误。

__invoke()

调用函数的章程调用叁个对象时的答疑方法。如下

__set_state()

调用var_export(卡塔尔(قطر‎导出类时,此静态方法会被调用。

var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj; }}$a = new A;$a->var1 = 5;$a->var2 = 'foo';var_dump;?>

__clone()

当指标复制作而成功时调用。举例在设计形式详明及PHP达成:单例情势一文中提到的单例形式达成情势,利用那几个函数来防止对象被克隆。

魔术常量

PHP中的常量超越四分之二都以不改变的,可是有8个常量会趁着他们四处代码地点的浮动而变化,那8个常量被叫做魔术常量。

__LINE__,文件中的当前进号
__FILE__,文件的完全路线和文书名 __DIR__,文件所在的目录
__FUNCTION__,函数名称 __CLASS__,类的名号
__TRAIT__,Trait的名字 __METHOD__,类的法门名
__NAMESPACE__,当前命名空间的名称

那一个魔术常量平时被用来获取当前条件消息可能记录日志。

以上正是本文的全部内容,希望对我们的学习抱有利于。

发表评论

电子邮件地址不会被公开。 必填项已用*标注