PHP的魔术常量(变量)、魔术⽅法(函数)、超全局变量
⼀、魔术常量(魔术变量)
概念:所谓的魔术常量就是PHP预定义的⼀些常量,这些常量会随着所在的位置⽽变化。
1、__LINE__  获取⽂件中的当前⾏号。
2、__FILE__  获取⽂件的完整路径和⽂件名。
3、__DIR__  获取⽂件所在⽬录。
4、__FUNCTION__  获取函数名称(PHP 4.3.0 新加)。
5、__CLASS__    获取类的名称(PHP 4.3.0 新加)。
6、__METHOD__  获取类的⽅法名(PHP 5.0.0 新加)。
7、__NAMESPACE__ 当前命名空间的名称(区分⼤⼩写)。
8、__TRAIT__  Trait 的名字(PHP 5.4.0 新加)。⾃ PHP 5.4 起此常量返回 trait 被定义时的名字(区分⼤⼩写)。Trait 名包括其被声明的作⽤区域(例如Foo\Bar)。
⼆、超全局变量(9个)
1、$GLOBALS  :储存全局作⽤域中的变量
2、$_SERVER  :获取服务器相关信息
3、$_REQUEST :获取POST和GET请求的参数
4、$_POST :获取表单的POST请求参数
5、$_GET:获取表单的GET请求参数
6、$_FILES :获取上传⽂件的的变量
7、$_ENV :获取服务器端环境变量的数组
8、$_COOKIE:获取浏览器的cookie
浏览器cookie的操作
设置cookie:setcookie(name, value, expire, path, domain);
获取cookie:$_COOKIE[“user”];
删除cookie:setcookie(“user”, “”, time()-3600);//设置过期时间
9、$_SESSION :获取session
服务端session的操作
使⽤session前⼀定要session_start()启动session
储存session:$_SESSION[‘name’]=”leixuesong”;//数组操作
销毁session:unset($_SESSION[‘views’]);//销毁⼀个
session_destroy()和unset($_SESSION);//销毁所有的session
三、魔术⽅法(魔术函数)
概念:PHP 将所有以 __(两个下划线)开头的类⽅法保留为魔术⽅法。所以在定义类⽅法时,除了上述魔术⽅法,建议不要以 __ 为前缀。
,,,,,,,,,,,,和等⽅法在 PHP 中被称为"魔术⽅法"(Magic methods)。在命名⾃⼰的类⽅法时不能使⽤这些⽅法名,除⾮是想使⽤其魔术功能。
1、构造函数:每次创建新对象(实例化对象)时先调⽤此⽅法,所以⾮常适合在使⽤对象之前做⼀些初始化⼯作。
应⽤笔记:如果⼦类中定义了构造函数则不会隐式调⽤其⽗类的构造函数。要执⾏⽗类的构造函数,需要在⼦类的构造函数
中调⽤ parent::__construct()。如果⼦类没有定义构造函数则会如同⼀个普通的类⽅法⼀样从⽗类继承(假如没有被定义为private 的话)。
应⽤范例:
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
/
/ In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
>
2、析构函数:析构函数会在到某个对象的所有引⽤都被删除或者当对象被显式销毁时执⾏。
和构造函数⼀样,⽗类的析构函数不会被引擎暗中调⽤。要执⾏⽗类的析构函数,必须在⼦类的析构函数体中显式调⽤
parent::__destruct()。此外也和构造函数⼀样,⼦类如果⾃⼰没有定义析构函数则会继承⽗类的。
析构函数即使在使⽤终⽌脚本运⾏时也会被调⽤。在析构函数中调⽤将会中⽌其余关闭操作的运⾏。
应⽤笔记:
1.析构函数在脚本关闭时调⽤,此时所有的 HTTP 头信息已经发出。脚本关闭时的⼯作⽬录有可能和在 SAPI(如 apache)中时不同。
2.试图在析构函数(在脚本终⽌时被调⽤)中抛出⼀个异常会导致致命错误。
应⽤范例:
<?php
class A
{
function __construct()
{
$a = func_get_args();
$i = func_num_args();
if (method_exists($this,$f='__construct'.$i)) {
call_user_func_array(array($this,$f),$a);
}
}
function __construct1($a1)
{
echo('__construct with 1 param called: '.$a1.PHP_EOL);
}
function __construct2($a1,$a2)
{
echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL);
}
function __construct3($a1,$a2,$a3)
{
echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL);
}
}
$o = new A('sheep');
$o = new A('sheep','cat');
$o = new A('sheep','cat','dog');
// results:
/
/ __construct with 1 param called: sheep
// __construct with 2 params called: sheep,cat
// __construct with 3 params called: sheep,cat,dog
>
3、:在对象中调⽤⼀个不可访问⽅法时,会被调⽤。
public __call ( string $name , array $arguments )
$name参数是要调⽤的⽅法名称。$arguments参数是⼀个枚举数组,包含着要传递给⽅法$name的参数。
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// 注意: $name 的值区分⼤⼩写
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/**  PHP 5.3.0之后版本  */
public static function __callStatic($name, $arguments)
{
// 注意: $name 的值区分⼤⼩写
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');  // PHP 5.3.0之后版本
>
4、:在静态上下⽂中调⽤⼀个不可访问⽅法时,会被调⽤。
5、:在给不可访问属性赋值时,会被调⽤。
6、:读取不可访问属性的值时,会被调⽤。
7、:当对不可访问属性调⽤或时,会被调⽤。
8、:当对不可访问属性调⽤时,会被调⽤。
9、:⽅法常⽤于提交未提交的数据,或类似的清理操作。同时,如果有⼀些很⼤的对象,但不需要全部保存,这个功能就很好⽤。
函数会检查类中是否存在⼀个魔术⽅法。如果存在,该⽅法会先被调⽤,然后才执⾏序列化操作。此功能可以⽤于清理对象,并返回⼀个包含对象中所有应被序列化的变量名称的数组。如果该⽅法未返回任何内容,则 NULL 被序列化,并产⽣⼀个 E_NOTICE 级别的错误。与之相反,会检查是否存在⼀个⽅法。如果存在,则会先调⽤__wakeup⽅法,预先准备对象需要的资源。
10、:经常⽤在反序列化操作中,例如重新建⽴数据库连接,或执⾏其它初始化操作。
应⽤范例:
<?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();
}
}
>
11、:⽅法⽤于⼀个类被当成字符串时回应。例如echo $obj;应该显⽰些什么。此⽅法必须返回⼀个字符串,否则将发出⼀条 E_RECOVERABLE_ERROR 级别的致命错误。
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class; //输出 Hello
>
11、:当尝试以调⽤函数的⽅式调⽤⼀个对象时,⽅法会被⾃动调⽤。(本特性只在 PHP 5.3.0 及以上版本有效)
<?php
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));  // is_callable — 检测参数是否为合法的可调⽤结构
>
以上会输出:
int(5)
bool(true)
12、:⾃ PHP 5.1.0 起当调⽤导出类时,此⽅法会被调⽤。本⽅法的唯⼀参数是⼀个数组,其中包含按array('property' => value, ...)格式排列的类属性。
应⽤范例:
<?php
class A
{析构方法
public $var1;
public $var2;
public static function __set_state($an_array) // As of PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
//    'var1' => 5,
//    'var2' => 'foo',
// ));
var_dump($b);
>
以上例程会输出:
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
13、:对象复制。当复制完成时,如果定义了⽅法,则新创建的对象(复制⽣成的对象)中的⽅法会被调⽤,可⽤于修改属性的值(如果有必要的话)
应⽤范例:
<?php
class SubObject
{

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。