gpt4 book ai didi

php - 重写 PHP 中的魔术方法

转载 作者:搜寻专家 更新时间:2023-10-31 21:31:02 26 4
gpt4 key购买 nike

我用谷歌搜索了一个小时,找到了这个问题的变体,但没有找到这个问题的确切版本,除了一篇无效的博文。

我想覆盖 PHP 扩展类中的一个方法,并在新类的主体中调用父类。问题是父级没有这样的方法,而是实现了 __call() 来公开该功能。

例如:

class B extends A {
public function setParentId($new_id)
{
parent::setParentId($new_id);
$this->buildParentTreeCache();
return $this;
}

这行不通。事实上,我遇到了一个严重的 Apache 内部错误或配置错误。

我发现这个解决方案也不起作用:(除了我添加了 array($new_id) 部分。示例使用 NULL。)

class B extends A {
public function setParentId($new_id)
{
parent::__call('setParentId', array($new_id));
$this->buildParentTreeCache();
return $this;
}

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

正确的做法是什么?

编辑:

我不确定我的配置有什么问题,但我得到的错误消息是:

[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”的 Doctrine 1 模型“Base”类。

class Category extends BaseCategory // My class
class BaseCategory extends sfDoctrineRecord // Autogenerated, prone to be verwritten by the generator

类 sfDoctrineRecord 的代码在这里:

http://trac.symfony-project.org/browser/branches/1.2/lib/plugins/sfDoctrinePlugin/lib/record/sfDoctrineRecord.class.php

最佳答案

正如 moonwave99 所建议的,你应该看看 here

Take care of using parent::method with not declared method when using __call because in this case the string method will be lowercase:

<?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

这可能是导致错误的原因,所以当您执行 parent::setParentId($new_id); 时,它很可能被解释为:

parent::setparentid($new_id);

A类也尽量使用小写

关于php - 重写 PHP 中的魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com