本文目录一览:
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__
这些常量不区分大小写。