如何在不编辑库的情况下覆盖PHPExcel方法?

时间:2012-09-17 13:04:35

标签: php oop phpexcel overwrite

我想在不触及库PHPExcel的情况下覆盖PHPExcel_Cell_DefaultValueBinder::dataTypeForValue()方法,以便以后升级库时不会有问题。

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

3 个答案:

答案 0 :(得分:4)

您可以创建一个新类从[{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()); 将使用您自己的ValueBinder执行其余的操作:)

答案 1 :(得分:4)

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);
    }
}

答案 2 :(得分: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 );