我如何实例化一个需要访问它的'instantiators'方法的类?

时间:2015-11-24 14:34:39

标签: php class oop

我有一个类,a()方法a1()。在a1()中我实例化了类b(),我怎样才能使b()可以访问所有公共变量,来自a()的方法?没有扩展它。类b()是我在几个位置使用的类,但我希望b()能够访问其实例化的类。另一种方法是实例化并将所有变量和内容传递给它,但这似乎相当丑陋而且不够灵活。

class a{
 var $test = 'yes'; // I want b() to be able to reach all public stuff in a()
 private $b;

 public function a1(){
  $this->b = new b();
  $this->b->b1();
 }
}

class b{
 public function b1(){
  echo $this->test; // Should echo 'yes'
 }
}

$temp = new a();
$temp->a1(); // Should echo 'yes'

2 个答案:

答案 0 :(得分:0)

根据评论一下,将数据从一个类推断到另一个类而不进行扩展的唯一其他方法是使用反射。

我可以详细说明,但一个例子说1000字。 http://php.net/manual/en/reflectionclass.getproperties.php

如果使用得当,反射可以变得非常强大。但是,我会说这是其中没有的情况之一,我建议重组你的课程,也许这是一个很好的方法来做特征。简单的说;将粘贴方法复制到类中。

你也可以把这个类作为参数传递,但它的用法会稍微改变一下。

    class a{
        public $test = 'yes'; // I want b() to be able to reach all public stuff in a()
        public $b;

        public function __construct(){
            $this->b = new b($this);
        }
    }

    class b{
        private $instance;

        public function b1(){
            echo $this->instance->test; // Should echo 'yes'
        }

        public function __construct($instance){
            if($instance instanceof a){
                $this->instance = $instance;
            } else {
                echo "argument is not a member of 'a'";
            }
        }
    }

    $temp = new a();
    $temp->b->b1(); // Should echo 'yes'
?>

答案 1 :(得分:0)

<?php
class a{
    var $test = 'yes'; // I want b() to be able to reach all public stuff in a()
    protected $b;

    public function a1(){
        $this->b = new b($this);
        $this->b->b1();
    }
}

class b{
    private $_parent = null;

    public function __construct($parent) {
        $this->_parent = $parent;
    }

    public function b1() {
        echo $this->_parent->test; // Should echo 'yes'
    }
}

$temp = new a();
$temp->a1(); // Should echo 'yes'