目录
__TRAIT__实际是什么
__TRAIT__在类中的行为(使用特征时)
示例:使用相同特征的多个类
为什么重要:调试和记录
关键要点
一个怪癖:混音as
首页 后端开发 php教程 __Trait__的上下文魔术:它在课堂内的行为

__Trait__的上下文魔术:它在课堂内的行为

Jul 29, 2025 am 04:31 AM
PHP Magic Constants

特征是PHP中的魔术常数,它总是返回定义其定义性状的名称,而不论使用该类别如何使用它。 1。在特征范围内的编译时间解决,并且不会根据调用类别更改。 2。与反映当前类上下文的class__不同,__ Trait仍然固定在特征的名称上。 3。这对于通过提供一致的性状标识来调试,记录和错误报告很有用。 4。它不能在特征外使用,如果尝试导致致命错误。 5。与“ AS”的方法混叠不影响性状__的值,因为特征的内部环境保持不变。因此,__ Trait可靠地自我确定了特征,从而确保了不同类别的可预测行为。

__Trait__的上下文魔术:它在课堂内的行为

__TRAIT__不是一个内置的PHP常数 - 您可能会想到__TRAIT__ ,它PHP的神奇常数,类似于__CLASS____METHOD____FUNCTION__ 。它专门用于特质的上下文,并了解其在类(以及特征本身)内的行为表现出一些微妙但有力的上下文行为。

让我们分解__TRAIT__的“上下文魔术”,以及当特征在课堂内使用时的作用。


__TRAIT__实际是什么

__TRAIT__是一个神奇的常数,它返回其使用的特征名称为字符串。它在特质的身体内部只是有意义的。就像__CLASS__给您当前的类名称一样, __TRAIT__可以为您提供当前特质的完全合格的名称 - 但仅来自特征。

特质mytrait {
    public函数getTraitName(){
        返回__ trait__;
    }
}

类myclass {
    使用mytrait;
}

$ obj = new myClass();
echo $ obj-> getTraitName(); //输出:mytrait

到目前为止,这么简单。但这是魔术和混乱开始的地方。


__TRAIT__在类中的行为(使用特征时)

即使将特征的方法注入了类, __TRAIT__却不会根据类别的类别进行更改。它在编译时间而不是运行时解决,并且始终涉及该特质自己的名字 - 无论哪个类都使用。

示例:使用相同特征的多个类

特质记录器{
    公共功能日志($消息){
        回声'['。 __ Trait__。 ']''。 $消息。 php_eol;
    }
}

类用户{
    使用Logger;
}

类产品{
    使用Logger;
}

$ user = new user();
$ product = new Product();

$ user-> log(“用户创建”); // [logger]创建的用户
$ product-> log(“添加产品”); // [logger]添加了产品

即使在不同类别中使用了Logger__TRAIT__在两种情况下仍可以评估'Logger' 。它不会成为'User''Product'

这与__CLASS__不同,__class __根据呼叫上下文而改变:

特质testContext {
    公共功能ShowClass(){
        Echo“ class:”。 __班级__ 。 “ \ n”;
    }

    公共功能ShowTrait(){
        回声“特质:”。 __ Trait__。 “ \ n”;
    }
}

班级示例{
    使用TestContext;
}

$ e = new示例();
$ e-> showclass(); //班级:示例
$ e-> showtrait(); //特质:testContext

因此, __CLASS__反映了该方法所调用的类别,但是__TRAIT__反映了其定义的特征- 无论其使用何处。


为什么重要:调试和记录

__TRAIT__的一致行为使其在以下方面非常有用:

  • 日志记录:即使在许多类中共享日志线,您也可以识别日志线的来源。
  • 错误报告:抛出有关哪种特征生成错误的上下文的异常。
  • 动态行为:根据性状名称有条件执行代码(罕见,但可能)。

例如:

特质SecureAccess {
    公共功能checkAccess(){
        如果(!$ this-> currentuserhasaccess()){
            投掷新\异常(“特征中拒绝的访问:”。__ trait__);
        }
    }
}

这给出了比硬编码特征名称更清晰的错误消息。


关键要点

  • ✅__ __TRAIT__编译时间内解决特征内部
  • ✅它总是返回特征的名称,从来没有使用过它。
  • ❌不能在特征之外使用它 - 它是未定义的(导致致命错误)。
  • ?与__CLASS__不同,它不会根据类上下文进行更改。

因此,尽管__CLASS__对呼叫者是上下文,但__TRAIT__自我指出和固定的


一个怪癖:混音as

即使您通过use MyTrait::method as myMethod;__TRAIT__仍然可以使用相同的工作 - 因为该方法身体没有改变。

特征apihelper {
    公共功能getClient(){
        回声“来自特质:”。 __特征__;
    }
}

类legacySystem {
    使用apihelper {getClient作为getOldClient; }
}

$ obj = new LegacySystem();
$ obj-> getOldClient(); //仍然打印:来自特质:apihelper

重命名该方法不会影响性状代码的内部上下文。


简而言之, __TRAIT__是一种小而强大的工具,无论使用何处,都可以保持其身份。它的行为是一致的,可预测的,并且与特征自己的定义有着深远的关系,而不是采用它的类别。

基本上,这就像一个特质说:“无论您在哪里使用我,我永远都知道我是谁。”

以上是__Trait__的上下文魔术:它在课堂内的行为的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
4 周前 By 百草
在PHP中评论代码
3 周前 By 百草
撰写PHP评论的提示
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1604
29
PHP教程
1509
276
__Trait__的上下文魔术:它在课堂内的行为 __Trait__的上下文魔术:它在课堂内的行为 Jul 29, 2025 am 04:31 AM

TRAITisamagicconstantinPHPthatalwaysreturnsthenameofthetraitinwhichitisdefined,regardlessoftheclassusingit.1.Itisresolvedatcompiletimewithinthetrait’sscopeanddoesnotchangebasedonthecallingclass.2.UnlikeCLASS__,whichreflectsthecurrentclasscontext,__TR

构建防弹自动加载器:深入研究__DIR__常数 构建防弹自动加载器:深入研究__DIR__常数 Jul 31, 2025 pm 12:47 PM

dirisessential forbuildingReliablephpautoloadersbecapeitProvideStable,绝对epathtothtothecurrentfile'sdirectory,可确保ConsistentBehaviorActractRospDifferentenVerentenments.1.unlikeLikeLikeLikeLikeLikeLikeLativePathSorgatSorgetCwd(),Diriscontext-Expontext-Indeptertentententententententententertentertentertriprip,disternepertriper,ingingfailfip

通过__dir__解决复杂应用中的路径歧义 通过__dir__解决复杂应用中的路径歧义 Jul 29, 2025 am 03:51 AM

使用__DIR__可以解决PHP应用中的路径问题,因为它提供当前文件所在目录的绝对路径,避免相对路径在不同执行上下文下的不一致。1.DIR__始终返回当前文件的目录绝对路径,确保包含文件时路径准确;2.使用__DIR.'/../config.php'等方式可实现可靠文件引用,不受调用方式影响;3.在入口文件中定义APP_ROOT、CONFIG_PATH等常量,提升路径管理的可维护性;4.将__DIR__用于自动加载和模块注册,保证类和服务路径正确;5.避免依赖$_SERVER['DOCUMENT

掌握相对路径:__dir__和__file__的功能 掌握相对路径:__dir__和__file__的功能 Jul 30, 2025 am 05:35 AM

DIR和FILE是PHP中的魔术常量,能有效解决相对路径在复杂项目中导致的文件包含错误。1.FILE返回当前文件的完整路径,__DIR__返回其所在目录;2.使用DIR可确保include或require总是相对于当前文件执行,避免因调用脚本不同而导致路径错误;3.可用于可靠包含文件,如require_onceDIR.'/../config.php';4.在入口文件中定义BASE_DIR常量以统一项目路径管理;5.安全加载配置文件,如$config=requireDIR.'/config/dat

通过上下文魔术常数增强您的错误记录策略 通过上下文魔术常数增强您的错误记录策略 Aug 01, 2025 am 07:47 AM

Contextualmagicconstantsarenamed,meaningfulidentifiersthatprovideclearcontextinerrorlogs,suchasUSER_LOGIN_ATTEMPTorPAYMENT_PROCESSING.2.Theyimprovedebuggingbyreplacingvagueerrormessageswithspecific,searchablecontext,enablingfasterrootcauseidentificat

使用__Class__,__Method__和__ -Namespace________________________________________________________________________________________________________________________________________________________________________ 使用__Class__,__Method__和__ -Namespace________________________________________________________________________________________________________________________________________________________________________ Aug 01, 2025 am 07:48 AM

CLASS__,__METHOD__,and__NAMESPACEarePHPmagicconstantsthatprovidecontextualinformationformetaprogramming.1.CLASSreturnsthefullyqualifiedclassname.2.METHODreturnstheclassandmethodnamewithnamespace.3.NAMESPACEreturnsthecurrentnamespacestring.Theyareused

通过__line __,__file__和__function _______________________________________________________________________________________________________________________________ 通过__line __,__file__和__function _______________________________________________________________________________________________________________________________ Jul 29, 2025 am 03:21 AM

theSostEffectiveDebuggingTrickinc/c Isusing the-inmacros__file __,__行__和__function__togetPreciseErrorContext.1 .__ file __ file __providestHecurrentsourcefile'spathasastring.2 .__ line__ line__ line__givestHecurrentLineNumberenneNumberennumberennumberennumber.___________________________3

魔术常数如何增强您的基于特质的架构 魔术常数如何增强您的基于特质的架构 Jul 29, 2025 am 04:07 AM

在trait-based架构中,魔法常量并非反模式,而是可作为有意设计的编译时标记或优化提示。1.魔法常量可用作版本开关,如通过constVERSION:u8区分序列化行为,使下游代码依据版本条件编译;2.可作为标签优化动态派发,如为trait实现分配唯一TAG常量,实现快速路径匹配并可能被编译器内联消除;3.可替代RTTI提供轻量级类型区分,如通过编译时哈希生成类型指纹,避免运行时类型信息开销;4.使用时需避免真正“魔法”,应统一定义、充分文档化,并优先使用枚举或位标志增强可读性,如用enum

See all articles