Php 重写Yii2类

Php 重写Yii2类,php,yii2,Php,Yii2,假设yii2应用程序是高级的。我想覆盖\yii\helpers\endoctor::hasIntl()的基本实现,该实现由yii\web\Response间接使用 原始代码 protected static function hasIntl() { return extension_loaded('intl'); } 我想要的代码 <?php namespace backend\components; class Inflector extends \yii\helpers\

假设yii2应用程序是高级的。我想覆盖
\yii\helpers\endoctor::hasIntl()
的基本实现,该实现由
yii\web\Response
间接使用

原始代码

protected static function hasIntl()
{
    return extension_loaded('intl');
}
我想要的代码

<?php

namespace backend\components;

class Inflector extends \yii\helpers\Inflector
{
    protected static function hasIntl()
    {
        return false;
    }
}
但是没有使用自定义实现。它继续使用原来的一个。因此,问题是:

  • 为什么不工作
  • 一个好的替代方案?(贴了一张丑陋的照片)
我以前读过并使用过这个
Yii::$container->set
方法,但在这种情况下不起作用,即使这样做:

Yii::$container->set('\yii\helpers\Inflector', [
    'class' => '\backend\components\Inflector',
]);

我不认为这是一个优雅的解决方案< /强>

我可以通过以下方法解决此问题:

Yii::$classMap['yii\helpers\Inflector'] = '@path/to/new/file'
但这看起来不像其他解决方案那么优雅,就像替换文件一样。在这种情况下,新文件必须具有原始名称空间
yii\helpers\endoctor
和扩展
yii\helpers\baseendoctor

官方确认了这种方法,但类映射看起来有点不同:

Yii::$classMap['yii\helpers\Inflector'] = '@app/components/Inflector.php';

我对Yii一无所知,但如果这能帮上忙的话,我有个建议。看起来您可以自己定义一个类
yii\helpers\endoctor
,并让它扩展
yii\helpers\baseendoctor
(包含默认实现)。不确定这就是你想要的(甚至不确定它是否有效,但有人提到了)。是的,谢谢你的推荐。有趣的线索。但他最终没有说要把文件放在哪里进行覆盖。我认为创建一个名称空间与原始名称空间相同的类是不正确的。我打算做扩展版本,并告诉框架使用它。是的,这是我实现的“丑陋”解决方案。但在本例中,新文件实际上正在替换原始文件。使用相同的名称空间和所有内容。嗯,在某个点上,必须告诉框架使用哪个类。。。与普通应用程序类相比,框架类的工作原理稍有不同(人们可能会称之为丑陋)。保留建议的注释,因为它会更改默认行为。
Yii::$classMap['yii\helpers\Inflector'] = '@app/components/Inflector.php';