- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 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;
}
我认为,这段代码应该可以工作。因为我在 Base
类中将 init()
重命名为 initBase()
并且在使用 BaseTrait
时进行了相同的重命名在 MainTrait
中,我希望此方法 (BaseTrait::init()
) 不会与 MainTrait::init()
冲突。事实上,PHP 说我有不兼容的声明。其背后的原因是将 init 重命名为 initBase
不起作用 - 方法 init
仍然存在,在我的 Base
类中!
有什么方法可以解决这个问题,而不是从一开始就将 BaseTrait::init() 重命名为类似 BaseTrait::initBase() 的东西(不仅仅是在 use
语句中)?
我应该将此视为 PHP 错误并报告吗?这种行为背后有什么合理的地方吗?
最佳答案
如评论中所述,为了完整性;来自PHP manual section on Traits :
The
Aliased_Talker
makes use of the as operator to be able to use B'sbigTalk
implementation under an additional alias talk.
然后:
The as operator can be used to add an alias to one of the methods. Note the as operator does not rename the method and it does not affect any other method either.
所以 as
添加了一个别名,但不会以任何方式替换或影响原始方法。这是预期的行为。
关于php - 为什么方法重命名在 PHP 特征中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836171/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!