首页 > 编程知识 正文

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

时间:2023-12-27 15:09:11 阅读:323180 作者:LXQF

本文目录一览:

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 

Magicconstant::b 

5 _DIR_ 

   显示当前目录名,如 

  echo "The directory name is : ". __DIR__; 

输出: 

  The directory name is : D:wampwww 

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_ 

  _sleep_用在将类序列化之前, 

?php 

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

                        // This will serialize only address and Phone number but not Name 

?php 

$User = new User(); 

$User-setName('Avinash'); 

$User-setAddress('Address Here'); 

$User-setPhone('1234567890'); 

$serialData = serialize($User); 

echo $serialData; 

OutPut: O:4:"User":2:{s:11:"userAddress";s:12:"Address Here";s:9:"userPhone";s:10:"1234567890";} 

程序运行时, serialize() 检查类中是否有 __sleep() ,如果有,则该函数将在任何序列化之前运行. 该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性. 该函数有两个作用: 第一. 在序列化之前,关闭对象可能具有的任何数据库连接等. 第二. 指定对象中需要被序列化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep()要返回的数组中,这样该属性就不会被序列化 

又如: 

class Test { 

public $mySecret; //我的秘密不想让人知道 

public function __construct($secret) { 

$this-mySecret = $secret; 

public function __sleep() { 

$this-mySecret = "你休想知道我的秘密!"; 

return array('mySecret'); //一定要返回变量,不然返回的是个空,所以序列化也就没有东西了。 

$test = new Test("我的心里话 我爱某某某"); 

echo serialize($test); //输出 O:4:"Test":1:{s:8:"mySecret";s:28:"你休想知道我的秘密!";} 

_wakeup_ 

用在反序列化时: 

?php 

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

                       // This will serialize only address and Phone number but not Name 

function __wakeup() 

echo "In Wakeup function"."br/"; 

?php 

$User = new User(); 

$User-setName('Avinash'); 

$User-setAddress('Address Here'); 

$User-setPhone('1234567890'); 

$serialData = serialize($User); 

echo $serialData; 

echo "br/"; 

var_dump(unserialize($serialData)); 

Output: 

In Wakeup function 

object(User)#2 (3) { 

  ["userName"]= 

  string(0) "" 

  ["userAddress"]= 

  string(12) "Address Here" 

  ["userPhone"]= 

  string(10) "1234567890" 

//以上信息转自 不代表个人观点 仅供参考 若满意 请采纳本答案

几个PHP 的“魔术常量”

几个 PHP 的“魔术常量”

名称

说明

__LINE__

文件中的当前行号。

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自

PHP 4.0.2 起,__FILE__

总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于

dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

=

__FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5

起本常量返回该函数被定义时的名字(区分大小写)。在

PHP 4 中该值总是小写字母的。

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5

起本常量返回该类被定义时的名字(区分大小写)。在

PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如

FooBar)。注意自 PHP 5.4 起 __CLASS__

对 trait 也起作用。当用在 trait 方法中时,__CLASS__

是调用 trait 方法的类的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait

被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如

FooBar)。

__METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)

PHP魔术常量怎么用

例如需要打开一个文件,在对象创建时打开,对象消亡时关闭

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

}

}

?

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

}

}

?

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

?

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

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

?

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

}

}

?

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

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

对于一些基本的常量是这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模块,如:

PHP_VERSION

PHP_OS

PHP_SAPI

PHP_EOL

对于一些是通过加载扩展库才会出现,比如:

DIRECTORY_SEPARATOR (string)

PATH_SEPARATOR (string)

对于上面的常量是区分大小写的。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,也就是说魔术常量是不区分大小写的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。