Php 返回没有继承属性的当前类对象

Php 返回没有继承属性的当前类对象,php,class,Php,Class,我有一个自动加载器,在加载小框架时初始化许多对象。对象被保存为静态变量,但现在我遇到了一个问题。我有一个在autoloader中实例化的文件,但稍后会像异常处理程序一样使用,在调用时处理特殊情况。其目的是该类中的方法返回$this,即类对象,但这样做时,返回的值不是被调用对象的实例,而是继承到调用它的类中。此外,被调用的异常处理程序不仅是自身的一个实例,而且是整个autoloader中实例化的所有内容,在加载所有内容时继承$this。令人困惑,但我建立了一个小示例: class a {

我有一个自动加载器,在加载小框架时初始化许多对象。对象被保存为静态变量,但现在我遇到了一个问题。我有一个在autoloader中实例化的文件,但稍后会像异常处理程序一样使用,在调用时处理特殊情况。其目的是该类中的方法返回$this,即类对象,但这样做时,返回的值不是被调用对象的实例,而是继承到调用它的类中。此外,被调用的异常处理程序不仅是自身的一个实例,而且是整个autoloader中实例化的所有内容,在加载所有内容时继承$this。令人困惑,但我建立了一个小示例:

class a {
    public $a_tmp = 'tmp';
}

class b extends a {
    public $b_tmp = 'tmp';

    public function getOnlyThisClass() {
        return $this;
    }
}

$b = new b();
$b->getOnlyThisClass();
这将返回:

object(b)#1 (2) {
  ["b_tmp"]=>
  string(3) "tmp"
  ["a_tmp"]=>
  string(3) "tmp"
}
我需要它在调用特殊方法时只返回被调用的类。我知道这可以用工厂模式修复,但在这种情况下希望避免


谢谢。

尝试使用反射来获取没有继承属性的类对象属性:

<?php

class a {
    public $a_tmp = 'tmp';
}

class b extends a {
    public $b_tmp = 'tmp';

    public function getOnlyThisClass() {
        $cl       = new stdClass();
        $refclass = new ReflectionClass($this);
        foreach ($refclass->getProperties() as $property)
        {
            $name = $property->name;
            if ($property->class == $refclass->name) {
                $cc = $property->name;
                $cl->$cc = $this->$name;
            }
        }
        return $cl;
    }
}
$b = new b();
var_dump($b->getOnlyThisClass());

您可以创建一个stdClass并在那里分配找到的属性。。完成此操作以满足您的需要。

为什么不将
$a_tmp
设置为私有?这是一个小例子,将$a_tmp设置为私有意味着我应该将整个框架中的所有内容都设置为私有,因为只有一个类。也许我错了,但工厂模式更具吸引力。:)我不确定我是否理解这个问题,如果你理解:new b()这将返回一个从a继承一些方法和属性的b实例。但是,当您调用GetOnlyThis类时,您希望b的实例没有经过初始化的方法和属性?这是一个很好的示例,但实际上看不出这是如何工作的,类b需要将自身作为对象返回,自身的实例。在我的应用程序中,$b中有一些方法,一旦调用并存储在变量中,我就需要访问这些方法。您的返回一个字符串,我可以再次验证。在我的应用程序中,我需要这个来验证“$tmp instanceof b”。我以为你需要它只是为了调试。。听起来似乎不可能将类从它的父类中分离出来,并且仍然是它自己。我想你是对的,单件工厂模式是我解决这个问题的方法。谢谢你的帮助!
object(stdClass)#2 (1) { ["b_tmp"]=> string(3) "tmp" }