Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 非常有趣的特殊课程。如何重新分配'$这';或者如何计算这个?_Php_Class_Object_This - Fatal编程技术网

Php 非常有趣的特殊课程。如何重新分配'$这';或者如何计算这个?

Php 非常有趣的特殊课程。如何重新分配'$这';或者如何计算这个?,php,class,object,this,Php,Class,Object,This,我有一个类似于此的代码: class A { public function a() { echo "I'm at 'a' function of the class 'A'<br>"; } public function b() { echo "I'm at 'b' function of the class 'A'<br>"; } // ... and several other functio

我有一个类似于此的代码:

class A
{
   public function a()
   {
       echo "I'm at 'a' function of the class 'A'<br>";
   }

    public function b()
   {
       echo "I'm at 'b' function of the class 'A'<br>";
   }
   // ... and several other functions.

   public function z()
   {
       echo "I'm at 'z' function of the class 'A'<br>";
   }

}


class B
{
   public function a()
   {
       echo "I'm at 'a' function of the class 'B'<br>";
   }

    public function b()
   {
       echo "I'm at 'b' function of the class 'B'<br>";
   }
   // ... and several other functions.

   public function z()
   {
       echo "I'm at 'z' function of the class 'B'<br>";
   }

}

class Special
{
    public function construct($param)
    {
         //This code will not work. Is there an alternative?
         $this = new $param;
    }
}

$special = new Special("A");
$special->a();

$special = new Special("B");
$special->b();

Ouput:

    I'm at 'a' function of the class 'A'
    I'm at 'b' function of the class 'B'
public function h()
{
    // $param could be 'A' or 'B';
    $this->param->h();
}
但我真的不喜欢这样做,因为对于“A”或“B”类上的每个函数,我都需要这样做

我最希望的是
特殊的
类可以运行函数,就好像它是在构造方法上作为参数传递的另一个类一样

如何计算这个问题?

我想我理解你的意思-你可以将一个对象作为参数传递给另一个类

大概是这样的:

class A {
    public function calledByB(){}  
}
class B {

    public function callsA( A $obj ){
        $obj->calledByB();
    }
}


$b = new B();
$b->callsA( new A() );

创建对象
a
的新实例,并将其传递给另一个类的方法或构造函数

我认为有两种方法可以做到这一点。第一种更像工厂模式,第二种使用重载

工厂:

class Special
{
    public static function inst($param)
    {
         //This code will not work. Is there an alternative?
        return new $param;
    }
}

$special = Special::inst("A");
$special->a();

$special = Special::inst("B");
$special->b();

在工厂模式中,从静态方法返回类的实例。那么这个变量实际上是对其他类的引用,您只是使用
Special
进行实例化

第二个方法将实例化保持在内部,但使用php的uuu GET、uuu SET和uu调用来获取/设置/调用该对象

class Special
{
    private $internal;

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

    public function __get($key)
    {
        return $this->internal->$key;
    }

    public function __set($key,$value)
    {
        $this->internal->$key=$value;
    }

    public function __call($method,$args)
    {
        return call_user_func_array(array($this->internal,$method),$args);
    }

}

$special = new Special("A");
$special->a();

$special = new Special("B");
$special->b();


两者都应该对工厂做同样的事情,这很可能是首选方法。

使用
公共静态函数()
您可以使用
self::
调用内部函数,但不建议经常使用静态函数,我在昨天发布一个问题后,在过去对此进行了试验,当我不移动时,我会发布我所做的事情。。大约30/40分钟乔纳森,非常有趣。优雅的我更喜欢第一种方法,但它不起作用。第二个也很好。关于第一种方法,我们需要改变什么吗?如果你能让它工作,请张贴整个代码,因为没有工作给我。我已经更新了它,现在它的工作。我没有使类成为静态的,然后您必须调用一个静态方法。工厂模式是一种实际接受的设计模式,我链接到了它的维基百科页面。我最初犯了一个错误,因为构造函数无法返回值。Jonathan,差不多了^^<代码>$special=新特价(“A”)返回
我在两个方法上都是'a'类的'a'函数
。为什么以及如何修复?我正在阅读模式,但看起来像是一种php缺失错误,具有“错误”的映射。可能吗?我想我不明白这个问题。我包含了两组代码的链接。我看到的唯一问题是构造函数的问题。您的类被定义为
class A
,但它也有一个
公共函数A
的方法。在较旧的php4中,构造函数是与类同名的方法。因此,当您实例化
newa
时,它也会调用方法
A
。这就是为什么你们两次看到“我在‘a’类的‘a’函数”的原因。BotskoNet,对不起,我不明白你们的答案。你能再解释一下吗?可能是提议一个特殊的课程?可能是我不理解这个问题。