2024年PHP开发者大会日本站

预定义常量

PHP 为其运行的任何脚本提供大量预定义常量。但是,许多这些常量是由各种扩展创建的,只有在这些扩展可用时(通过动态加载或因为它们已被编译)才会出现。

添加笔记

用户贡献笔记 5 条笔记

vijaykoul_007 at rediffmail dot com
19年前
区别在于
在PHP 5.0.4中,__FUNCTION__和__METHOD__的区别在于

__FUNCTION__只返回函数名

而__METHOD__返回类名和函数名

类 trick
{
函数 doit()
{
echo __FUNCTION__;
}
函数 doitagain()
{
echo __METHOD__;
}
}
$obj=new trick();
$obj->doit();
输出将是 ---- doit
$obj->doitagain();
输出将是 ----- trick::doitagain
Tomek Perlak [tomekperlak at tlen pl]
18年前
__CLASS__ 魔术常量很好地补充了 get_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
php at kenman dot net
10年前
刚学习了一个关于__FILE__和较新的__DIR__以及从网络共享运行代码的有趣细节:从共享上下文中执行时,这些常量将返回*共享*路径。

示例

// 普通上下文
// 调用为 "php -f c:\test.php"
__DIR__ === 'c:\';
__FILE__ === 'c:\test.php';

// 网络共享上下文
// 调用为 "php -f \\computerName\c$\test.php"
__DIR__ === '\\computerName\c$';
__FILE__ === '\\computerName\c$\test.php';

注意:无论执行上下文如何,realpath('.') 似乎总是返回实际的文件系统路径。
Sbastien Fauvel
8年前
请注意,在特性中使用 __CLASS__ 和 __METHOD__ 时存在一个小小的不一致性(标准 php 7.0.4):虽然 __CLASS__ 按广告宣传的那样工作并动态返回使用特性的类的名称,但 __METHOD__ 实际上会在类名前添加特性名称!
public at taliesinnuin dot net
4年前
如果您使用带有 fpm 的 PHP(当今很常见),请注意 __DIR__ 和 __FILE__ 将返回基于 fpm 根的值,这可能与它在文件系统上的实际位置不同。

如果部署一个应用程序,其中 web 根目录中的 php 文件从自身外部提取 PHP 文件(非常常见的情况),这可能会导致暂时的挠头。您可能想知道为什么 __DIR__ 返回 "/",而文件本身位于 /var/www/html 或其他位置。

您可以通过让 NGINX 明确地添加路径的必要部分到其 fastcgi 请求中来处理这种情况,然后您可以将 FPM 进程/服务器/容器上的根目录设置为 web 根目录以外的其他内容(只要没有其他方法可以公开访问它)。

希望这能为将使用 __DIR__ 的代码迁移到 FPM 的任何人节省五分钟时间。
To Top