今天看到一个魔术变量,是以前没见过的,__DIR__,我查了查,发现原来是php5.3新增的,顺便举几个例子,解释一下php的魔术变量
1,__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
这个变量,我用的是最多的,估计也是大家用的最多的。
web服务器都会指定一个documentroot的,但是不同的服务器,设置的documentroot有可能是不同的,在这种情况下,把一个网站从一个服务器搬家到另一个服务器,这样就有可能因为路径的不同,造成网站跑不起来。
- <?php
-
-
-
-
define('ROOT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
-
echo ROOT_PATH;
-
echo "<br>";
-
echo __FILE__;
-
echo "<br>";
-
echo dirname(__FILE__);
-
echo "<br>";
-
echo dirname(dirname(__FILE__));
- ?>
<?php
/**
在你的公用的配置文件中,来设置你的根目录,这样就不用担心经常搬家了。
*/
define('ROOT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
echo ROOT_PATH;
echo "<br>";
echo __FILE__;
echo "<br>";
echo dirname(__FILE__);
echo "<br>";
echo dirname(dirname(__FILE__));
?>
2,__LINE__
文件中的当前行号。这个变量在调试错误的时候,还是比较有作用的,其他的时候,没什么用处,纯属个人观点。
<?php
echo __LINE__; //显示,__LINE__所在的行号
?>
3,__CLASS__
类的名称,PHP5返回的结果是区分大小写的
- <?php
-
class base_class
- {
-
function say_a()
- {
-
echo "'a' - said the " . __CLASS__ . "<br/>";
- }
-
function say_b()
- {
-
echo "'b' - said the " . get_class($this) . "<br/>";
- }
- }
-
-
class derived_class extends base_class
- {
-
function say_a()
- {
- parent::say_a();
-
echo "'a' - said the " . __CLASS__ . "<br/>";
- }
-
function say_b()
- {
- parent::say_b();
-
echo "'b' - said the " . get_class($this) . "<br/>";
- }
- }
-
-
$obj_b = new derived_class();
-
$obj_b->say_a();
-
echo "<br/>";
-
$obj_b->say_b();
- ?>
- 结果为:
-
'a' - said the base_class
-
'a' - said the derived_class
-
-
'b' - said the derived_class
-
'b' - said the derived_class
<?php
class base_class
{
function say_a()
{
echo "'a' - said the " . __CLASS__ . "<br/>";
}
function say_b()
{
echo "'b' - said the " . get_class($this) . "<br/>";
}
}
class derived_class extends base_class
{
function say_a()
{
parent::say_a();
echo "'a' - said the " . __CLASS__ . "<br/>";
}
function say_b()
{
parent::say_b();
echo "'b' - said the " . get_class($this) . "<br/>";
}
}
$obj_b = new derived_class();
$obj_b->say_a();
echo "<br/>";
$obj_b->say_b();
?>
结果为:
'a' - said the base_class
'a' - said the derived_class
'b' - said the derived_class
'b' - said the derived_class
有的时候,我们可以用get_class来代替__CLASS__
4,__FUNCTION__和__METHOD__
__FUNCTION__:函数名称,php5中返回的结果是区分大小写的
__METHOD__:方法中的函数名称,php5中返回的结果是区分大小写的
二个都是取得方法的名称,有什么不同呢?
- <?php
-
class test
- {
-
function a()
- {
-
echo __FUNCTION__;
-
echo "<br>";
-
echo __METHOD__;
- }
- }
-
-
function good (){
-
echo __FUNCTION__;
-
echo "<br>";
-
echo __METHOD__;
- }
-
-
$test = new test();
-
$test->a();
-
echo "<br>";
- good();
- ?>
- 返回结果:
- a
- test::a
- good
- good
<?php
class test
{
function a()
{
echo __FUNCTION__;
echo "<br>";
echo __METHOD__;
}
}
function good (){
echo __FUNCTION__;
echo "<br>";
echo __METHOD__;
}
$test = new test();
$test->a();
echo "<br>";
good();
?>
返回结果:
a
test::a
good
good
相对于孤立的函数来说,二个都可以取出函数名,没什么区别,如果是class中的方法时,__FUNCTION__只能取出class的方法名,而__METHOD__不光能取出方法名,还能取出class名
5,__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
如果在5.3以前的版本中想用__DIR__的话,可以这样
- <?php
-
if(!defined('__DIR__')) {
-
$iPos = strrpos(__FILE__, "/");
-
define("__DIR__", substr(__FILE__, 0, $iPos) . "/");
- }
- ?>
<?php
if(!defined('__DIR__')) {
$iPos = strrpos(__FILE__, "/");
define("__DIR__", substr(__FILE__, 0, $iPos) . "/");
}
?>
6,__NAMESPACE__
当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)
7,__STATIC__
当你调用class的静态方法时,返回class名称,区分大小写。如果在继承中调用的话,不管在继承中有没有定义,都能返回继承的class名。
- <?php
-
-
class Model
- {
-
public static function find()
- {
-
echo __STATIC__;
- }
- }
-
-
class Product extends Model {}
-
class User extends Model {}
-
-
Product::find();
-
User::find();
- ?>
<?php
//php5.3
class Model
{
public static function find()
{
echo __STATIC__;
}
}
class Product extends Model {}
class User extends Model {}
Product::find(); // "Product"
User::find(); // "User"
?>
原文出处:
http://blog.51yip.com/php/1165.html
分享到:
相关推荐
在PHP编程语言中,魔术变量和魔术函数是一组特殊的预定义常量和函数,它们的行为与常规常量和函数有所不同,因为它们的值会根据它们在代码中的位置和上下文自动变化。这些特性使得PHP更加灵活,同时也为开发者提供了...
在PHP编程语言中,魔术常量(Magic Constants)是一类特殊的预定义常量,它们的值根据其在代码中的位置自动变化。这些常量的名字通常由两个下划线(__)开头,使得它们在普通变量中脱颖而出。在PHP 5.3版本中,为了...
魔术变量还包括__FILE__、__LINE__、__FUNCTION__、__CLASS__和__METHOD__等。 1. __FILE__魔术变量:__FILE__返回当前脚本的完整路径和文件名。如果它位于被包含的文件中,则返回被包含文件的名称。从PHP 4.0.2...
PHP中的魔术方法和魔术变量是面向对象编程中的特殊功能,它们允许开发者在一些特定的情况下,使用预定义的命名约定来执行特定操作。在PHP中,魔术方法和变量通常以双下划线(__)开头,并在特定的事件发生时自动调用,...
在PHP编程语言中,魔术常量是一类特殊常量,它们的值会随着代码执行环境的变化而自动更新。这些常量通常以两个下划线 "__" 开头,以提供有关当前代码上下文的信息。以下是对七个常用魔术常量的详细说明: 1. **__...
在PHP中,魔术方法是一组特殊的方法,它们具有特定的名称,可以在特定的情况下自动触发。魔术方法在PHP的开发中扮演着非常重要的角色,尤其对于面向对象编程而言,它们提供了一种灵活的方式来处理对象的状态和行为。...
魔术方法是PHP中具有特定功能的预定义方法,它们的名称以双下划线`__`开头。程序员不应随意创建同名方法,以避免覆盖这些功能。以下是一些常见的魔术方法: 1. `__construct()`:对象创建时自动调用的构造函数。 2....
PHP中的魔术常量是PHP预定义的一系列特殊的常量,它们与常规的常量不同,因为它们的值并不是固定的,而是根据当前脚本的执行情况动态变化的。魔术常量在PHP的开发中扮演着重要角色,它们可以帮助开发者编写更加健壮...
PHP5扩展了对文件和目录操作的支持,提供了诸如`file_get_contents`、`file_put_contents`、`mkdir`等函数,方便进行文件读写和目录管理。 **8. XML处理** PHP5的DOM、SimpleXML和XMLWriter库提供了强大的XML处理...
总之,PHP中的__FILE__魔术常量和dirname()函数为我们提供了便捷的方式来获取当前执行脚本的绝对路径和目录信息,这是进行文件操作和路径管理的重要工具。在不同的开发和部署环境下,正确地使用这些功能,可以大幅...
魔术常量如__FILE__, __LINE__, __CLASS__, __FUNCTION__等可以帮助开发者获取运行时的信息。魔术方法如__construct(), __destruct(), __get(), __set()等则提供了对象生命周期管理和动态属性访问的便利。 10. **...
PHP提供了许多魔术常量(如__FILE__, __LINE__, __CLASS__等),它们在特定上下文中自动获取值,帮助开发者更好地定位代码。魔术方法(如__construct, __destruct, __call等)则是类中特殊功能的方法,用于处理...
在这个payload中,`''.__class__.__mro__[2]`获取到了`str`类的基类`object`,然后遍历它的子类,通过`__init__.__globals__['__builtins__']`获取到内置模块,并尝试调用`file`函数来读取文件。 此外,攻击者还...
在手册中,你会了解到PHP的基本语法,包括变量、数据类型、运算符、控制结构(如if/else、switch/case、for、while等)、函数定义与调用、数组操作以及面向对象编程(OOP)的概念。PHP支持多种数据类型,如整型、...
PHP支持面向对象编程,包括类的定义(class)、属性、方法、构造函数、析构函数、继承(extends)、封装(访问修饰符public、private、protected)、多态(抽象类和接口)、以及魔术方法(__get()、__set()等)。...
3. 魔术方法:PHP5引入了魔术方法,如`__construct()`构造函数、`__destruct()`析构函数、`__get()`和`__set()`用于访问不可见属性。 五、类与对象 PHP5引入了完整的面向对象编程(OOP)支持,包括类定义、继承、...