12 Php学习:魔术常量

PHP魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。
在这里插入图片描述

不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

​​__LINE__​:当前行号,返回这个常量所在的行号。
​​__FILE__​:当前文件的完整路径和文件名。
​​__DIR__​:当前文件所在的目录。
​​__FUNCTION__​:当前函数的名称。
​​__CLASS__​:当前类的名称。
​​__TRAIT__​:当前 trait 的名称。
​​__METHOD__​:当前方法的名称(包括类名)。
​​__NAMESPACE__​:当前命名空间的名称。

详细介绍和举例

当然,让我们逐个详细解释和举例这八个 PHP 魔术常量:

  1. __LINE____LINE__ 常量返回当前行号,即它所在的代码行在源文件中的行号。这对于调试和记录错误非常有用。

    示例:

    echo "当前行号:" . __LINE__;
    

    输出:

    当前行号:3
    
  2. __FILE____FILE__ 常量返回当前文件的完整路径和文件名。它可用于获取正在执行的脚本的文件名。

    示例:

    echo "当前文件:" . __FILE__;
    

    输出:

    当前文件:/path/to/your/file.php
    
  3. __DIR____DIR__ 常量返回当前文件所在的目录的完整路径。

    示例:

    echo "当前目录:" . __DIR__;
    

    输出:

    当前目录:/path/to/your/directory
    
  4. __FUNCTION____FUNCTION__ 常量返回当前函数的名称。这对于记录日志和调试时非常有用。

    示例:

    function myFunction() {echo "当前函数:" . __FUNCTION__;
    }
    myFunction();
    

    输出:

    当前函数:myFunction
    
  5. __CLASS____CLASS__ 常量返回当前类的名称。如果在类的方法中调用,它将返回该方法所属的类的名称。

    示例:

    class MyClass {public function showClassName() {echo "当前类:" . __CLASS__;}
    }
    $obj = new MyClass();
    $obj->showClassName();
    

    输出:

    当前类:MyClass
    
  6. __TRAIT____TRAIT__ 常量返回当前 trait 的名称。如果在 trait 方法中调用,它将返回该方法所属的 trait 的名称。

    示例:

    trait MyTrait {public function showTraitName() {echo "当前 trait:" . __TRAIT__;}
    }
    class MyClass {use MyTrait;
    }
    $obj = new MyClass();
    $obj->showTraitName();
    

    输出:

    当前 trait:MyTrait
    
  7. __METHOD____METHOD__ 常量返回当前方法(包括类名)的名称。在类的方法中调用时,它将返回类名和方法名的组合。

    示例:

    class MyClass {public function showMethodName() {echo "当前方法:" . __METHOD__;}
    }
    $obj = new MyClass();
    $obj->showMethodName();
    

    输出:

    当前方法:MyClass::showMethodName
    
  8. __NAMESPACE____NAMESPACE__ 常量返回当前命名空间的名称。

    示例:

    namespace MyNamespace;
    echo "当前命名空间:" . __NAMESPACE__;
    

    输出:

    当前命名空间:MyNamespace
    

这些魔术常量在不同的上下文中提供了关于当前执行环境的重要信息,可用于调试、日志记录和动态代码生成等情景。

PHP 命名空间(namespace)

PHP 命名空间(namespace)是在 PHP 5.3 中加入的,目的是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。

PHP 命名空间可以解决以下两类问题:

  • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

在这里插入图片描述

定义命名空间

在 PHP 中,命名空间被用来解决代码命名冲突的问题,它能够将类、函数、常量等封装在命名空间中,防止不同代码库中的同名标识符之间发生冲突。让我详细解释如何定义命名空间以及提供一个示例。

定义命名空间的基本语法:

在 PHP 中,我们使用 namespace 关键字来定义命名空间。命名空间应该出现在所有非 PHP 代码之前,包括 declareuserequireinclude 语句。下面是定义命名空间的基本语法:

namespace MyNamespace;// 这里是命名空间内的代码

在这个语法中:

  • MyNamespace 是命名空间的名称,您可以根据需要自定义命名空间的名称。

示例:

让我们看一个简单的示例来演示如何定义命名空间并使用命名空间内的类。

// 文件:MyClass.php
namespace MyNamespace;class MyClass {public function sayHello() {echo "Hello from MyClass!";}
}// 文件:index.php
require "MyClass.php"; // 引入定义了命名空间的文件$obj = new MyNamespace\MyClass(); // 使用完整的命名空间路径实例化类
$obj->sayHello();

在这个例子中,我们通过 namespace MyNamespace; 定义了命名空间 MyNamespace,然后在另一个文件中通过 require 引入了定义了命名空间的文件,并实例化了命名空间内的类。

通过使用命名空间,我们可以有效地组织和管理 PHP 代码,避免了命名冲突,并提高了代码的可维护性和可重用性。

子命名空间

子命名空间是指在一个已经存在的父命名空间下创建的额外命名空间。子命名空间的作用类似于文件系统中的文件夹结构,可以更好地组织和管理代码。让我详细解释一下,并给出一个示例。

在 PHP 中,可以使用 namespace 关键字定义子命名空间。子命名空间的定义方式与父命名空间类似,只需在父命名空间后面加上反斜杠 \,然后跟上子命名空间的名称。下面是定义子命名空间的基本语法:

namespace ParentNamespace\SubNamespace;// 这里是子命名空间内的代码

在这个语法中:

  • ParentNamespace 是父命名空间的名称。
  • SubNamespace 是子命名空间的名称。

示例:

让我们通过一个示例来演示如何定义和使用子命名空间。

假设我们有一个父命名空间 MyNamespace,现在我们要在这个命名空间下创建一个子命名空间 SubNamespace,并在子命名空间中定义一个类 SubClass

// 文件:MyNamespace/SubNamespace/SubClass.php
namespace MyNamespace\SubNamespace;class SubClass {public function sayHello() {echo "Hello from SubClass!";}
}

现在,在另一个文件中我们可以使用这个子命名空间中的类:

// 文件:index.php
require "MyNamespace/SubNamespace/SubClass.php"; // 引入定义了子命名空间的文件$obj = new MyNamespace\SubNamespace\SubClass(); // 使用完整的命名空间路径实例化子命名空间中的类
$obj->sayHello();

在这个示例中,我们成功地定义了子命名空间 SubNamespace,并在其中定义了一个类 SubClass。然后在另一个文件中通过引入子命名空间的文件,并使用完整的命名空间路径实例化了 SubClass 类。

子命名空间的使用可以更好地组织和管理代码,使代码结构更加清晰易懂。

使用命名空间

使用命名空间可以帮助您组织和管理 PHP 代码,避免命名冲突,并提高代码的可维护性和可重用性。下面是一些关于如何使用命名空间的基本方法:

  1. 声明命名空间

在您的 PHP 文件的最开始位置使用 namespace 关键字来声明命名空间。例如:

namespace MyNamespace;class MyClass {// 类的定义
}function myFunction() {// 函数的定义
}

在这个例子中,我们声明了命名空间 MyNamespace 并定义了一个类和一个函数。

  1. 引入命名空间

要在另一个文件中使用命名空间中的类或函数,可以使用 use 关键字将命名空间引入当前的作用域。例如:

use MyNamespace\MyClass;
use function MyNamespace\myFunction;$obj = new MyClass(); // 实例化命名空间中的类
myFunction(); // 调用命名空间中的函数
  1. 完整的命名空间路径

如果不使用 use 引入命名空间,还可以通过完整的命名空间路径来访问命名空间中的类或函数。例如:

$obj = new MyNamespace\MyClass(); // 使用完整的命名空间路径实例化类
MyNamespace\myFunction(); // 使用完整的命名空间路径调用函数
  1. 命名空间的使用

如果需要在父命名空间下创建子命名空间,可以按照前面提到的方法进行定义和使用。

示例:

// 定义命名空间和类
namespace MyNamespace;class MyClass {public function sayHello() {echo "Hello from MyNamespace!";}
}// 在另一个文件中使用命名空间中的类
require "MyClass.php"; // 引入定义了命名空间的文件use MyNamespace\MyClass;$obj = new MyClass(); // 实例化命名空间中的类
$obj->sayHello(); // 调用类中的方法

在这个示例中,我们定义了一个命名空间 MyNamespace,在另一个文件中使用了 use 关键字引入了命名空间中的类,并成功地实例化了这个类并调用了其中的方法。

命名空间和动态语言特征

PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

example1.php 文件代码:

<?php
class classname
{function __construct(){echo __METHOD__,"\n";}
}
function funcname()
{echo __FUNCTION__,"\n";
}
const constname = "global";$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。

动态访问命名空间的元素

<?php
namespace namespacename;
class classname
{function __construct(){echo __METHOD__,"\n";}
}
function funcname()
{echo __FUNCTION__,"\n";
}
const constname = "namespaced";include 'example1.php';$a = 'classname';
$obj = new $a; // 输出 classname::__construct
$b = 'funcname';
$b(); // 输出函数名
echo constant('constname'), "\n"; // 输出 global/* 如果使用双引号,使用方法为 "\\namespacename\\classname"*/
$a = '\namespacename\classname';
$obj = new $a; // 输出 namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // 输出 namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // 输出 namespacename\funcname
$b = '\namespacename\funcname';
$b(); // 输出 namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // 输出 namespaced
echo constant('namespacename\constname'), "\n"; // 输出 namespaced
?>

namespace关键字和__NAMESPACE__常量

namespace 关键字和 __NAMESPACE__ 常量是 PHP 中用于处理命名空间的重要工具。下面我将详细解释它们,并通过示例来说明它们的用法。

  1. namespace 关键字:

namespace 关键字用于定义当前文件中类、函数或常量所属的命名空间。在同一个文件中,namespace 关键字必须在所有代码之前声明。

语法:

<?php
namespace MyNamespace;class MyClass {// 类实现
}function myFunction() {// 函数实现
}
?>
  1. __NAMESPACE__ 常量:

__NAMESPACE__ 是一个魔术常量,用于返回当前命名空间的名称。它在任何地方都可使用,即使在没有明确指定命名空间的地方也可以使用。

示例:

<?php
// 文件: MyNamespace/MyClass.php
namespace MyNamespace;class MyClass {public function getNamespace() {return __NAMESPACE__;}
}
?><?php
// 文件: index.php
require "MyNamespace/MyClass.php";$obj = new MyNamespace\MyClass();
echo $obj->getNamespace(); // 输出:MyNamespace
?>

在这个示例中,我们定义了一个命名空间 MyNamespace,并在类中使用了 __NAMESPACE__ 常量来获取当前命名空间的名称。然后在另一个文件中实例化该类,并输出当前命名空间的名称。

通过使用 namespace 关键字和 __NAMESPACE__ 常量,可以更好地组织和管理代码,避免命名冲突,并了解当前代码所在的命名空间。

使用命名空间:别名/导入

PHP中使用命名空间的别名和导入功能可以帮助简化代码,提高可读性。下面我将解释如何使用命名空间的别名(Aliases)和导入(Imports)功能,并提供示例说明:

  1. 使用别名(Aliases):

在 PHP 中,您可以为一个较长或复杂的命名空间路径创建一个短的别名,以便在代码中更方便地引用这个命名空间。这里简单介绍一下如何使用别名:

语法:

use Namespace\Long\ClassName as Alias;
示例:
use MyNamespace\SubNamespace\AnotherClass as AnotherAlias;$object = new AnotherAlias(); // 创建一个命名空间的别名对象实例
  1. 使用导入(Imports):

通过导入命名空间,您可以在当前作用域中引入多个类、函数或常量,而无需重复使用完整的命名空间路径。下面简单介绍如何使用导入:

语法:
use Namespace\ClassA;
use Namespace\ClassB;

示例:

use MyNamespace\SubNamespace\SomeClass;
use MyApp\Helpers\HelperFunctions;$obj1 = new SomeClass(); // 直接使用导入的类
HelperFunctions::someFunction(); // 直接访问导入的函数

完整示例:

<?php
// 定义命名空间及类
namespace MyNamespace\Utilities;class Logger {public function log($message) {echo "Logging: $message";}
}// 在另一个文件中导入和使用
require "Logger.php";use MyNamespace\Utilities\Logger as MyLogger; // 为 Logger 类创建别名 MyLogger$log = new MyLogger();
$log->log("An important message"); // 使用别名创建的实例调用方法
?>

在这个示例中,我们定义了一个命名空间 MyNamespace\Utilities,在另一个文件中通过导入并为 Logger 类创建了别名 MyLogger,然后实例化该类并调用其中的方法。

使用命名空间:后备全局函数/常量

在PHP中,可以通过命名空间的后备全局函数和常量来实现在命名空间内找不到函数或常量时,自动回退到全局命名空间中查找。这样可以确保即使在特定命名空间内没有定义某个函数或常量,程序仍能正常运行。

后备全局函数:

使用 namespace 关键字前添加反斜杠 \ 可以在命名空间中找不到函数时,自动回退到全局空间寻找该函数。

示例:
namespace MyNamespace;function myFunction() {// 函数实现
}\myFunction(); // 如果在当前命名空间找不到 myFunction,则自动回退到全局空间查找

后备全局常量:

类似地,通过在命名空间中找不到常量时,在常量名前加上反斜杠 \ 可以在全局空间中查找该常量。

示例:
namespace MyNamespace;define("MY_CONSTANT", "Some value");echo \MY_CONSTANT; // 如果在当前命名空间找不到 MY_CONSTANT 常量,则自动回退到全局空间查找

这样,无论是函数还是常量,当在特定命名空间内找不到时,PHP会自动在全局空间中查找。这种机制确保了代码的灵活性并简化了命名空间的使用。

全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。

使用全局空间说明

<?php
namespace A\B\C;/* 这个函数是 A\B\C\fopen */
function fopen() { /* ... */$f = \fopen(...); // 调用全局的fopen函数return $f;
} 
?>

命名空间的顺序

自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。

<?php
namespace A;
use B\D, C\E as F;// 函数调用foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()// 再尝试调用全局函数 "foo"\foo();     // 调用全局空间函数 "foo" my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" // 再尝试调用全局函数 "F"// 类引用new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象// 如果未找到,则尝试自动装载类 "A\B"new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象// 如果未找到,则尝试自动装载类 "B\D"new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象// 如果未找到,则尝试自动装载类 "C\E"new \B();   // 创建定义在全局空间中的类 "B" 的一个对象// 如果未发现,则尝试自动装载类 "B"new \D();   // 创建定义在全局空间中的类 "D" 的一个对象// 如果未发现,则尝试自动装载类 "D"new \F();   // 创建定义在全局空间中的类 "F" 的一个对象// 如果未发现,则尝试自动装载类 "F"// 调用另一个命名空间中的静态方法或命名空间函数B\foo();    // 调用命名空间 "A\B" 中函数 "foo"B::foo();   // 调用命名空间 "A" 中定义的类 "B""foo" 方法// 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D""foo" 方法// 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"\B\foo();   // 调用命名空间 "B" 中的函数 "foo" \B::foo();  // 调用全局空间中的类 "B""foo" 方法// 如果类 "B" 未找到,则尝试自动装载类 "B"// 当前命名空间中的静态方法或函数A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B""foo" 方法// 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"\A\B::foo();  // 调用命名空间 "A" 中定义的类 "B""foo" 方法// 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

在这里插入图片描述

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616551.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具&#xff0c;并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据&#xff0c;当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level&#xff1a;音量大小&a…

Java 原生代码获取服务器的网卡 Mac 地址、CPU序列号、主板序列号

1、概述 Java 可以获取服务器的网卡 Mac 地址、CPU 序列号、主板序列号等信息&#xff0c;用来做一些软件授权验证、设备管理等场景。 2、代码实现 package com.study.util;import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Scanner;/*** …

gma 2.0.8 (2024.04.12) 更新日志

安装 gma 2.0.8 pip install gma2.0.8网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

理想大模型实习面试题6道|含解析

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

STM32外设配置以及一些小bug总结

USART RX的DMA配置 这里以UART串口1为例&#xff0c;首先点ADD添加RX和TX配置DMA&#xff0c;然后模式一般会选择是normal&#xff0c;这个模式是当DMA的计数器减到0的时候就不做任何动作了&#xff0c;还有一种循环模式&#xff0c;是计数器减到0之后&#xff0c;计数器自动重…

计算机毕业设计Python+Flask电商商品推荐系统 商品评论情感分析 商品可视化 商品爬虫 京东爬虫 淘宝爬虫 机器学习 深度学习 人工智能 知识图谱

一、选题背景与意义 1.国内外研究现状 国外研究现状&#xff1a; 亚马逊&#xff08;Amazon&#xff09;&#xff1a;作为全球最大的电商平台之一&#xff0c;亚马逊在数据挖掘和大数据方面具有丰富的经验。他们利用Spark等大数据技术&#xff0c;构建了一套完善的电商数据挖…

算法100例(持续更新)

算法100道经典例子&#xff0c;按算法与数据结构分类 1、祖玛游戏2、找下一个更大的值3、换根树状dp4、一笔画完所有边5、树状数组&#xff0c;数字1e9映射到下标1e56、最长回文子序列7、超级洗衣机&#xff0c;正负值传递次数8、Dijkstra9、背包问题&#xff0c;01背包和完全背…

RT-Thread 启动流程源码详解

RT-Thread 启动流程 一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺 序是:系统先从启动文件开始运行,然后进入 RT-Thread 的…

LLM大语言模型微调方法和技术汇总

本文详细介绍了机器学习中的微调技术&#xff0c;特别是在预训练模型上进行微调的方法和技术。文章首先解释了什么是微调&#xff0c;即在预训练模型的基础上&#xff0c;通过特定任务的数据进行有监督训练&#xff0c;以提高模型在该任务上的性能。随后&#xff0c;详细介绍了…

Spark-Scala语言实战(16)

在之前的文章中&#xff0c;我们学习了三道任务&#xff0c;运用之前学到的方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#x…

【C++题解】 问题:1109 - 加密四位数

问题&#xff1a;1109 - 加密四位数 类型&#xff1a;基础问题、拆位求解 题目描述&#xff1a; 某军事单位用 4 位整数来传递信息&#xff0c;传递之前要求先对这个 4 位数进行加密。加密的方式是每一位都先加上 5 然后对 10 取余数&#xff0c;再将得到的新数颠倒过来。 例…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现&#xff1a; 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包按照不同流…