Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中重写一个神奇的方法_Php_Overriding - Fatal编程技术网

在PHP中重写一个神奇的方法

在PHP中重写一个神奇的方法,php,overriding,Php,Overriding,我在谷歌上搜索了一个小时,找到了这个问题的变体,但没有找到这个问题的确切版本,除了一篇不起作用的博客文章 我想重写PHP扩展类中的一个方法,并在新类的主体内调用父类。问题是父级没有这样的方法,但实现了\u call()来公开该功能 例如: class B extends A { public function setParentId($new_id) { parent::setParentId($new_id); $this->buildParentTreeC

我在谷歌上搜索了一个小时,找到了这个问题的变体,但没有找到这个问题的确切版本,除了一篇不起作用的博客文章

我想重写PHP扩展类中的一个方法,并在新类的主体内调用父类。问题是父级没有这样的方法,但实现了
\u call()
来公开该功能

例如:

class B extends A {
  public function setParentId($new_id) 
  {
     parent::setParentId($new_id);
     $this->buildParentTreeCache();
     return $this;
  }
这不管用。事实上,我遇到了一个严重的Apache内部错误或配置错误

我发现这个解决方案也不起作用: (除了我添加了
数组($new\u id)
部分。示例使用NULL。)

这个应该有用的!我不知道我做错了什么

正确的方法是什么

编辑:

我不确定我的配置出了什么问题,但我在这里看到的错误消息只是:

[Mon May 04 12:13:12.778136 2015] [fastcgi:error] [pid 30512] (104)Connection reset by peer: [client 127.0.0.1:54854] FastCGI: comm with server "/var/www/fastcgi/php5.fastcgi" aborted: read failed, referer: http://admin.mysite/index.php/category/index
[Mon May 04 12:13:12.779620 2015] [fastcgi:error] [pid 30512] [client 127.0.0.1:54854] FastCGI: incomplete headers (0 bytes) received from server "/var/www/fastcgi/php5.fastcgi", referer: http://admin.mysite/index.php/category/index
编辑2:

基类(本例中的类A)是一个自动生成的文件,其中也没有我试图调用的代码

事实上,它是一个从sfDoctrineRecord扩展而来的称为“BaseCategory”的条令1模型“基本”类

class Category extends BaseCategory // My class
class BaseCategory extends sfDoctrineRecord // Autogenerated, prone to be verwritten by the generator
sfDoctrineRecord类的代码如下:


正如moonwave99建议的那样,您应该看看

在使用时注意使用parent::method和未声明的方法 __调用,因为在这种情况下字符串方法将是小写的:


输出:
精力充沛的人
B获得
这可能是导致错误的原因,因此当您执行
parent::setParentId($new_id)时它可能被解释为:

父:设置parentid($new\u id)


试着在A类中也使用小写字母

你能详细说明一下不起作用吗?你犯了什么错误?查看Apache/PHP错误日志以获取描述。可能值得了解:您应该能够只调用
parent::setParentId($new\u id)
,而不是
parent::\u call(etc)
@jamesspunce好吧,请参阅moonwave99的链接…@moonwave99啊,有趣,我从来不知道这一点。谢谢你的提醒!可悲的问题。我无法控制A类的接口。@SebastiánGrignoli这确实是个问题,如果你想办法解决它,请告诉我们。这是一个非常有趣和棘手的问题!
class Category extends BaseCategory // My class
class BaseCategory extends sfDoctrineRecord // Autogenerated, prone to be verwritten by the generator
<?php
  class A {
      function __call( $method, $args ) {
        echo get_class( $this )  . ' ' . $method . "\n";
      }
  }

  class B extends A {
      function getTest() {
          parent::getTest();
      }
  }

$a = new A();
$a->getTest();
$b = new B();
$b->getTest();

?>

output:

A getTest
B gettest