本文目录一览:
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:\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_
_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 中该值总是小写字母的。类名包括其被声明的作用区域(例如
Foo\Bar)。注意自 PHP 5.4 起 __CLASS__
对 trait 也起作用。当用在 trait 方法中时,__CLASS__
是调用 trait 方法的类的名字。
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait
被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如
Foo\Bar)。
__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__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,也就是说魔术常量是不区分大小写的。