为什么方法重命名在 PHP 特征中不起作用?

2024-02-12

我使用 PHP 7.1.0。

假设我们有一个特征,我们在类中使用它并重命名导入的方法:

trait T
{
    public function A() {
        echo ".";
    }
}

class C
{
    use T {
        A as B;
    }
}

$c = new C();
$c->B();
$c->A(); // Why does it work?

为什么 PHP 仍然允许我使用旧的方法名称(A在这种情况下)?

这确实很痛苦,因为在更复杂的示例中,您不能依赖方法重命名 - 因此您可能会意外收到“不兼容的声明”错误:

class BaseSrc
{
}

trait BaseTrait
{
    public function init(BaseSrc $baseSrc)
    {
        echo "Init Base";
    }
}

class Base
{
    use BaseTrait {
        BaseTrait::init as initBase;
    }
}

$base = new Base();
$base->initBase(new BaseSrc());
$base->init(new BaseSrc()); // WHY DOES IT WORK?????

class MainSrc extends BaseSrc
{
}

trait MainTrait
{
    use BaseTrait {
        BaseTrait::init as initBase;
    }

    public function init(MainSrc $mainSrc)
    {
        $this->initBase($mainSrc);
        echo "Init Main";
    }
}

// Warning: Declaration of MainTrait::init(MainSrc $mainSrc) should be compatible with Base::init(BaseSrc $baseSrc)
class Main extends Base
{
    use MainTrait;
}

我认为,这段代码应该可以工作。自从我改名后init() into initBase() in the Base类并在使用时进行相同的重命名BaseTrait inside MainTrait,我期望这个方法(BaseTrait::init())不会与MainTrait::init()。事实上,PHP 说我有不兼容的声明。其背后的原因是更名init as initBase不起作用 - 方法init仍然在那里,在我的Base class!

有什么方法可以解决这个问题,而无需从一开始就将 BaseTrait::init() 重命名为类似 BaseTrait::initBase() 的东西(不仅仅是在use陈述)?

我应该将此视为 PHP 错误并报告吗?这种行为背后有什么合理的理由吗?


正如评论中提到的和为了完整性;来自PHP 手册中有关 Traits 的部分 http://php.net/manual/en/language.oop5.traits.php:

The Aliased_Talker利用 as 运算符能够使用 乙的bigTalk在额外的别名下实现谈话。

进而:

as 运算符可用于向其中一种方法添加别名。 请注意,as 运算符不会重命名该方法,并且不会影响 任何其他方法也可以。

So as添加别名,但不会以任何方式替换或影响原始方法。这是预期的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么方法重命名在 PHP 特征中不起作用? 的相关文章

随机推荐

  • Android 底部导航 Activity 在 onCreate 中出现空指针异常

    我向我的项目添加了一个底部导航活动 但是当我启动相关活动时 它给出了空指针异常 它说异常是在第 28 行触发的 在 lk apiit eea mobile Activities CompanyProfile onCreate Company
  • PHP:获取关联数组的第n项

    如果你有一个关联数组 Array uid gt Marvelous status gt 1 set later gt Array 0 gt 1 1 gt 0 op gt Submit submit gt Submit 如果您想访问第二项 您
  • 在特定桌面上启动进程

    如何在特定的 Windows 桌面上启动 Windows 进程 最好 我们正在寻找一种在 Windows 8 1 上也支持的解决方案 即不依赖于 Windows 10 的新任务视图功能 我知道 用户在 Windows 8 1 中不容易访问不
  • 使用 Backbone Marionette 使用现有渲染的 HTML 显示视图

    我有一个像所附的应用程序布局 上面的面板已经到了页面 即在服务器的 HTML 响应中 当用户与该面板中的元素交互时 下面的动态面板的内容会相应地发生变化 我研究了 Backbone Marionette 的各种视图类型和区域管理器 但我仍然
  • 更改 OS X 菜单栏中 Tkinter 应用程序的标题

    当您在 Python 中使用 Tkinter 创建带有 GUI 的应用程序时 应用程序的名称在 OS X 的菜单栏中显示为 Python 如何才能让它显示为其他内容 我的答案是基于埋在中间的一个一些论坛 http compgroups ne
  • statespace.SARIMAX模型:为什么模型使用所有数据来训练模式,并预测训练模型的范围

    我按照教程研究了SARIMAX模型 https www digitalocean com community tutorials a guide to time series forecasting with arima in python
  • Dagger 2 活动注入不起作用

    我正在尝试新的 dagger 2 这是我第一次实现它 但我无法让它工作 我想我已经明白了这个概念并且理解了这个例子here https github com LiveTyping u2020 mvp 我尝试复制相同的结构 只是针对我的示例进
  • Java Process.waitFor() 和 Readline 挂起

    首先 这是我的代码 import java io import java util Date import com banctecmtl ca vlp shared exceptions public class PowershellTes
  • elasticsearch有复合索引吗?

    我想知道elasticsearch是否需要预先定义复合索引 通过复合索引 我的意思是类似于 mongodb 的东西 db collection ensureIndex 字段1 1 字段2 1 字段3 1 或者类似于 mysql db 的东西
  • 有什么方法可以控制 NavigationView 标头内的视图吗?

    正如标题所说 我想知道是否有什么方法可以控制内部的视图NavigationView标题 添加或删除标头除外 例如 在标题中 我有一个用户头像 默认情况下 它显示访客图像 但用户登录后 将显示真实头像 如何才能做到这一点 将支持库更新到版本
  • 如何在单个视图中实现两个片段?

    我有一个包含 3 个片段的应用程序 而且viewpager 工作得很好 但我需要像 Android Play 商店中那样实现类似的视图 最初他们有 特色 选项卡 当您向左滑动时 我们可以看到 类别 选项卡 但一半的屏幕仍然充满了 精选 选项
  • 在单独的线程中运行异步循环,信号来自和循环

    我正在尝试制作一个在后台与多个 BLE 设备进行通信的 UI 为此 我实现了一个运行 asyncio loop 的单独线程 这是必要的 因为我使用 bleak 0 9 1 连接到设备 使用信号和槽将数据从 UI 线程获取到工作线程效果很好
  • iOS 5.1 和 Xcode 4.3.1 CodeSign 错误

    我刚刚下载了 iOS 5 1 和 Xcode 4 3 1 但是当我要在我的设备中进行测试时 Xcode 给出了错误 CodeSign 错误 SDK iOS 5 1 中的产品类型 应用程序 需要代码签名 知道如何修复它吗 尝试在每个字段中分配
  • 管理 web.config 文件

    我有 3 个环境 NET 4 上的 Dev QA Prod 每个环境都有一个唯一的 web config 文件 我们在管理所有三个版本时遇到了问题 在 TFS 中手动合并 web config 文件时 很容易忽略一些关键的东西 我们不止一次
  • 尽可能快地打开和读取数千个文件

    我需要尽快打开和读取数千个文件 我对 13 592 个文件进行了一些测试 发现方法 1 比方法 2 稍快 这些文件通常在 800 字节到 4kB 之间 我想知道是否可以做些什么来使这个 I O 密集的过程更快 Method 1 Run 1
  • 使用行/列索引对栅格进行子集化

    当对矩阵或 DF 进行子集化时 可以引用行列 例如df1 1 5 3 10 or df3 2 4 有没有办法用光栅来做到这一点 也就是说 我可以只剪辑第 500 700 行 例如从光栅对象中剪辑吗 我尝试过使用rasterFromCells
  • 使用 PyPlot 时出现 Julia 运行时错误

    如果我尝试在 Windows 8 1 上使用 Julia 0 6 0 使用 Plots 或 PyPlot 绘制任何内容 我会收到运行时错误消息 运行时错误 程序 C Users c AppData Local Julia 0 6 0 bin
  • 如何让express从另一个上层目录提供静态文件?

    如果我有一个具有以下文件夹结构的 Nodejs Express 应用程序 src client public css js views server server js 如何从 server js 文件中提供公共文件夹中的静态文件 因为它位
  • Swift 可选 - 不一致?

    我有点困惑 我以为我理解Options 并且在Apple开发论坛Chris L上提到解决不可变Optional问题的方法是为可选值类型创建一个类包装器 link https devforums apple com message 99888
  • 为什么方法重命名在 PHP 特征中不起作用?

    我使用 PHP 7 1 0 假设我们有一个特征 我们在类中使用它并重命名导入的方法 trait T public function A echo class C use T A as B c new C c gt B c gt A Why