【问题标题】:How to overwrite a PHPExcel method without editing the library ?如何在不编辑库的情况下覆盖 PHPExcel 方法?
【发布时间】:2026-01-19 21:00:02
【问题描述】:

我想覆盖PHPExcel_Cell_DefaultValueBinder::dataTypeForValue()方法而不接触PHPExcel库,这样我以后升级库就不会出现问题了。

事实上,我这样做是为了解决将数字转换为字符串的问题,我只是想知道如何覆盖一个方法,以便我可以继续使用该库而不会出现问题。

【问题讨论】:

  • 编写自己的值绑定器,实现 PHPExcel_Cell_IValueBinder 接口,在 bindValue() 方法中进行测试,并在匹配时设置单元格;但默认为默认值绑定器 - 这正是高级值绑定器所做的

标签: php oop phpexcel overwrite


【解决方案1】:

您可以创建一个新类,该类将从PHPExcel_Cell_DefaultValueBinder继承,并覆盖函数dataTypeForValue

<?php
class PHPExcel_Cell_MyValueBinder extends PHPExcel_Cell_DefaultValueBinder {

    public static function dataTypeForValue($pValue = null) {
        if (/* your condition */) {
            // if you want to return a value, and i guess it's what you want, you can
            return PHPExcel_Cell_DataType::YOUR_TYPE;
        }
        // you call the fonction PHPExcel_Cell_DefaultValueBinder::dataTypeForValue();
        // so the already existant conditions are still working.
        return parent::dataTypeForValue($pValue);
    }

}
?>

之后,只需使用PHPExcel_Cell_MyValueBinder 而不是PHPExcel_Cell_DefaultValueBinder,在代码顶部使用:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_MyValueBinder());

所以PHPExcel 将使用您自己的 ValueBinder 来完成其余的执行 :)

【讨论】:

    【解决方案2】:
    class PHPExcel_Cell_MyValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
    {
        public function bindValue(PHPExcel_Cell $cell, $value = null)
        {
            // sanitize UTF-8 strings
            if (is_string($value)) {
                $value = PHPExcel_Shared_String::SanitizeUTF8($value);
            }
    
            // Implement your own override logic
            if (is_string($value) && $value[0] == '0') {
                $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
                return true;
            }
    
            // Not bound yet? Use default value parent...
            return parent::bindValue($cell, $value);
        }
    }
    

    【讨论】:

    • 但是这样做,我还是要更改 fromArray 方法。所以我必须对那个方法做同样的事情
    • 不@Periback,看看我的答案我解释了如何做而不必编辑fromArray。 ;)
    • 拍得好,@JulienFouilhé!即使在创建方法之后,我也不知道如何调用它并替换古老的方法(这正是这个问题的重点!感谢@markBaker 为我的另一个问题提供了很好的解决方案!:D 你介意添加它作为一个解决方案吗?
    • 这允许您使用 fromArray()... fromArray() 方法在执行时调用单元格活页夹。只要您建议 PHPExcel 使用您的值绑定器,而不是使用默认值绑定器 PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_MyValueBinder() );然后 fromArray() 将使用您的活页夹。
    【解决方案3】:

    您可以扩展类并覆盖您希望扩展其功能的方法。这遵循SOLID programming 的打开/关闭原则(对扩展开放但对修改关闭),并且您不对 PHPExcel 进行任何更改。你只需要在扩展类上使用你的新类。

    namespace MyPHPExcel;
    
    class MyDataValueBinder extends \PHPExcel_Cell_DefaultValueBinder 
    {
        public static function dataTypeForValue($pValue = null)
        {
          ...method body
        }
    }
    
    $returnValue = \MYPHPExcel\MyDataValueBinder::dataTypeForValue( $someValue );
    

    【讨论】:

      最近更新 更多