我想在不触及库PHPExcel的情况下覆盖PHPExcel_Cell_DefaultValueBinder::dataTypeForValue()
方法,以便以后升级库时不会有问题。
事实上,我这样做是为了解决将数字转换为字符串的问题,我只是想知道如何覆盖一个方法,以便我可以继续使用该库而不会出现问题。
答案 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 );