php之魔术常量,魔术变量php

发布时间:2022-11-17

本文目录一览:

1、php 中的魔术常量有哪些
2、怎么样在php配置中加载魔术常量
3、几个PHP 的“魔术常量”
4、PHP魔术常量怎么用
5、PHP中的预定义常量,类常量和魔术常量的区别

php 中的魔术常量有哪些

  • __sleep()serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。
  • __wakeup()unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
  • __toString():当一个类被当成字符串时应怎样回应,例如 echo $obj; 时调用。
  • __invoke():当尝试以调用函数的方式调用一个对象时,该方法会被调用。
  • __set_state():当调用 var_export() 导出类时,此方法会被调用。
  • __debugInfo():当调用 var_dump() 导出类时,此方法会被调用。
  • __set():在给不可访问属性赋值时,__set() 会被调用。
  • __get():读取不可访问属性的值时,__get() 会被调用。
  • __isset():当对不可访问属性调用 isset()empty() 时,__isset() 会被调用。
  • __unset():当对不可访问属性调用 unset() 时,__unset() 会被调用。
  • __call():在对象中调用一个不可访问方法时,__call() 会被调用。
  • __callStatic():在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

怎么样在php配置中加载魔术常量

PHP 中的魔术常量用于获取当前代码的上下文信息,以下是常见的魔术常量及其用途:

1. __LINE__

显示当前代码的行数:

echo "This is line number : " . __LINE__;

2. __FILE__

显示当前文件的路径。

3. __METHOD__

显示当前方法的名称,例如:

class Magicconstant {
    function __construct() {
        echo "This is function a";
    }
    function b() {
        echo "br/";
        echo "This is function b";
        echo "br/";
        echo __METHOD__;
    }
}
$cm = new Magicconstant();
$cm->b();

输出:

This is function a
This is function b
Magicconstant::b

4. __FUNCTION__

显示当前所在函数的名称:

function b() {
    echo "br/";
    echo "This is function b";
    echo "br/";
    echo __FUNCTION__;
}

输出:

This is function b
b

5. __DIR__

显示当前目录名:

echo "The directory name is : " . __DIR__;

输出:

The directory name is : D:\wamp\www

6. __CLASS__

显示当前的类:

class Magicconstant {
    function __construct() {
        echo "The class name is : " . __CLASS__;
    }
}
$cm = new Magicconstant();

输出:

The class name is : Magicconstant

7. __NAMESPACE__

显示当前命名空间:

namespace MagicConstant {
    echo "The namespace is : " . __NAMESPACE__;
}

输出:

The namespace is : MagicConstant

8. __sleep()

用于在序列化之前执行操作:

class User {
    public $userName = '';
    public $userAddress = '';
    public $userPhone = '';
    public function setName($name='') {
        $this->userName = $name;
    }
    function setAddress($address='') {
        $this->userAddress = $address;
    }
    function setPhone($phone='') {
        $this->userPhone = $phone;
    }
    function __sleep() {
        return array('userAddress','userPhone');
    }
}

9. __wakeup()

用于在反序列化时执行操作:

function __wakeup() {
    echo "In Wakeup function" . "<br/>";
}

几个PHP 的“魔术常量”

名称 说明
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。
__DIR__ 文件所在的目录。
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。
__CLASS__ 类的名称(PHP 4.3.0 新加)。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。
__NAMESPACE__ 当前命名空间的名称(区分大小写)。

PHP魔术常量怎么用

1. __construct()__destruct()

用于对象创建和销毁时的操作:

class FileRead {
    protected $handle = NULL;
    function __construct() {
        $this->handle = fopen(...);
    }
    function __destruct() {
        fclose($this->handle);
    }
}

2. __call()__callStatic()

用于调用不可访问方法:

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');

3. __get()__set()__isset()__unset()

用于处理不可访问属性:

class MethodTest {
    private $data = array();
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : NULL;
    }
    public function __isset($name) {
        return isset($this->data[$name]);
    }
    public function __unset($name) {
        unset($this->data[$name]);
    }
}

4. __sleep()__wakeup()

用于序列化和反序列化时的操作:

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();
    }
}

5. __toString()

用于将对象转换为字符串:

class TestClass {
    public function __toString() {
        return 'this is a object';
    }
}
$class = new TestClass();
echo $class;

6. __invoke()

用于以函数方式调用对象:

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

7. __set_state()

用于导出类时的操作:

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));

8. __clone()

用于防止对象被克隆:

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);
    }
}

PHP中的预定义常量,类常量和魔术常量的区别

PHP 提供了多种类型的常量,包括预定义常量、类常量和魔术常量:

1. 预定义常量

PHP 向脚本提供了大量的预定义常量,这些常量由 PHP 内核或扩展库定义,例如:

  • PHP_VERSION
  • PHP_OS
  • PHP_SAPI
  • PHP_EOL
  • DIRECTORY_SEPARATOR
  • PATH_SEPARATOR 这些常量是区分大小写的。

2. 类常量

类常量是在类中定义的常量,使用 const 关键字定义,例如:

class MyClass {
    const MY_CONSTANT = 'value';
}
echo MyClass::MY_CONSTANT;

3. 魔术常量

魔术常量的值随着它们在代码中的位置改变而改变,例如:

  • __LINE__
  • __FILE__
  • __DIR__
  • __FUNCTION__
  • __CLASS__
  • __TRAIT__
  • __METHOD__
  • __NAMESPACE__ 这些常量不区分大小写。