10
回答
PHP中对象中的问题,大家帮忙点拨一下!
华为云实践训练营,热门技术免费实践!>>>   
<?php
class A extends B{
    function aaa(){
        $this->load->lib('C');
        $this->load->C->ccc();  //这样是可以调用的 但是我希望能 $this->C->ccc();这样调用
    }
}
class B{
    var $load;
    public function __construct() {
        $this->load = new Load;
    }
}
class Load{
    function lib($classname){
        $this->$classname = new $classname;
    }
}
class C{
    function ccc(){
        echo 'Hello World';
    }
}
$a = new A;
$a->aaa();
?>
大家帮忙看一下,我希望要的效果 写在注释里了,谢谢大家!!!
PHP
举报
大麦.sh
发帖于5年前 10回/260阅
共有10个答案 最后回答: 5年前
<?php
class A extends B{
    function aaa(){
        $this->load->lib('C');
        $this->C->ccc();  //这样是可以调用的 但是我希望能 $this->C->ccc();这样调用
    }
}
class B{
    var $load;
    public function __construct() {
        $this->load = new Load($this);
    }
}
class Load{
    function Load($bind){
        $this->bind = $bind;
    }
    function lib($classname){
        $this->bind->$classname = new $classname;
        
    }
}
class C{
    function ccc(){
        echo 'Hello World';
    }
}
$a = new A;
$a->aaa();

class A extends B{
    function aaa(){
        $this->C=$this->load->lib('C'); //方法加个返回值
        $this->C->ccc(); 
    }
}
class B{
    var $load;
    public function __construct() {
        $this->load = new Load;
    }
}
class Load{
    function lib($classname){
        $this->$classname = new $classname;
		return $this->$classname; //返回实例化之后的对象
    }
}
class C{
    function ccc(){
        echo 'Hello World';
    }
}
$a = new A;
$a->aaa();


引用来自“麦克韩哥”的答案

怎么都没人回答,我不想用楼上的这种方法啊

那你想用什么样的方法...

楼上这方法是最简单的..你要复杂的也行..

魔术方法结合反射类? 我觉得没那个必要啊

我希望 this ->load ->lib(c)之后直接可以使用 This->c  不要出现 This->c = 因为这段代码是在应用层 这样会很乱
楼上的 却是是我想要的了 ,但是如果当前对象庞大的时候,这样的用法又会极大的损耗性能,如果是这样,我们还有别的解决办法吗?

 

<?php

class Load{
    function lib($classname){
        $this->$classname = new $classname;
		return $this->$classname; //返回实例化之后的对象
    }
}

class B {
	var $load;
	var $_c; // private
	
	public function __construct() {
		$this->load = new Load;
	}

	public function __get($name) {
		if(!isset($this->_c[$name]) && class_exists($name)) {
			$this->_c[$name] = new $name;
		}
		if($this->_c[$name]) 
			return $this->_c[$name];
		
		throw new Exception('属性xxx未找到');
	}
}

class C {
	function ccc() {
		echo 'Hello World';
	}
}

class A extends B {
	
	public function aaa() {
		$this->C->ccc();
	}

}

$a = new A;
$a->aaa();

楼主你的代码紧密耦合,基本不具有重用性,到不如全部写在一个类里面。如果要让代码松耦合可重用,我给你提供一个改写版提供思路参考

<?php
class A extends B{
	public  $target;//保存载入目标实例
	public  $load;//保存载入工具实例
	function aaa($loaded,$target){
		$this->load->lib($loaded,$target,$this);//$loaded是目标类,$target是存有目标实例的属性名称
		$this->target->ccc();  //载入完成,执行ccc()
	}
}
class B{
	public function __construct() {
		$this->load = new Load;
	}
}
class Load{
	function lib($classname,$target,$obj){
		$obj->$target = new $classname;
	}
}
class C{
	function ccc(){
		echo 'Hello World';
	}
}
$a = new A;
$a->aaa('C','target');

顶部