我有一个对象,我只知道类名,比方说"A"。我正在尝试访问此对象的属性。不幸的是,我正试图从另一个对象实例访问它们,该对象实例由完全不同的类(既没有扩展也没有关联)的第一个对象创建。下面的简化代码解释了这种情况。
Class A {
public $var; //some important stuff
function createObjectB() {
$b = new B();
}
}
Class B {
// a totally different class not related with A
}
这是CMS中一个组件的第三方代码,所以我不能干扰核心代码(或者至少我认为是这样),如果这个组件更新了,我不能在以后不引起错误的情况下将属性与B创建的对象一起传递。
我可以从类B访问对象,因为稍后在B类中调用了一个"布局模板"文件,如果更新了核心代码,它就不会被触及。这样一来,我就无法真正接触到这两个类。
使用object B
中的debug_backtrace()
,我可以看到我需要的对象的属性后退了几步,但我认为以这种方式使用函数来获得我需要的信息是相当棘手的,我认为这也是一个相当密集的函数。
我是一个PHP新手,我试图实现的目标是不是完全错误了?有更好的方法吗?
遗传是一个公认的编程原则,PHP会在对象建模中使用它。这一原则将影响许多类和对象相互关联的方式。
例如,当扩展一个类时,子类继承父类的所有公共和受保护的方法。除非类覆盖,否则这些方法将保留其原始功能。
这对于定义和抽象功能非常有用,并且允许在类似对象中实现附加功能,而无需重新实现所有共享功能。
重要提示:除非使用自动加载,否则必须在使用类之前定义类。如果一个类扩展了另一个类,则父类必须在子类结构之前声明。此规则适用于从其他类和接口继承的类
<?php
class Foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP()
{
echo 'PHP is great.' . PHP_EOL;
}
}
class bar extends Foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}
$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Salida: 'Foo: baz'
$foo->printPHP(); // Salida: 'PHP is great'
$bar->printItem('baz'); // Salida: 'Bar: baz'
$bar->printPHP(); // Salida: 'PHP is great'
?>
您必须知道,您可以将新对象生成到其他类中。但是,您可以在不创建新实例的情况下将所有属性从类A继承到类B。例如:
<?php
Class A {
public function something() {
$var = 'Hello!';
return $var;
}
}
Class B extends A {
function createObjectB() {
echo $this->something().' I am learning classes in php';
}
}
$b = new B;
$b->createObjectB();
?>
请访问此页面http://php.net/manual/es/language.oop5.inheritance.php了解更多信息。