在php中的另一个类中扩展一个类

时间:2014-06-12 13:48:28

标签: php multithreading inheritance

我有一个A类,它扩展了B类,如下所示

Class A extends B
{


    function SendMAil(){

    /* Here Send Mail Code is wriiten */ 

    }

}

我有另一个C类,其中我实现了多线程概念,为此我需要extedn C frrom Thread

Class C extends Thread {


  function SendMail2(){

  /* Code For SendMail2() */


  }

}

现在我需要在A类中扩展Thread Class,这样我就可以在A类中使用多线程的功能了,我该怎么做呢

PS:当我们为PHP安装pthread库时,类Thread是php中的内置类,所以我们不能在Thread类中做任何改动。

我卡在那里!!我怎么能这样做?

提前致谢!!

3 个答案:

答案 0 :(得分:1)

然后你应该使用特征。特质很像类,但它们很可能只是用来捆绑你需要的东西,并且彼此之间有关系。

例如:

trait ThreadTrait {
    public function doSomeMultithreading() {
        // Put your multithreading code in here
    }
}

Class A extends B {
    use ThreadTrait;

    public function aFunctionWhereYouCanUseMultithreadingNow() {
        echo 'Multithreading possible in every class now!:)';
    }
}

现在,您可以在所需的每个类中访问多线程所需的所有函数。

答案 1 :(得分:1)

您可以先使用类B扩展类Thread,然后使用类A扩展类B。您将在课程Thread中获得B课程的所有公开和受保护成员。 像这样:

<?php 
class Thread {
    public function threadfunc() {
        echo "This is thread class";
    }
}
class B extends Thread {
    public function bfunc()
    {
        $this->threadfunc();
    }
}
Class A extends B {
    function SendMAil(){
        echo "sendmail";
    }
}
Class C extends Thread {
    function SendMail2(){
        echo "send mail 2";
    }

}
$obj = new A();
$obj->bfunc();

答案 2 :(得分:1)

这里的特征是没有用的,因为除了其他特征之外,它们不能由任何东西组成;特质不能extend一个类,而只能use个其他特征。

无论pthreads如何,你描述的继承都很奇怪。

关于pthread,Threaded的对象具有与普通PHP对象不同的语义,普通的PHP对象没有为线程做好充分准备,这是你需要声明的非常好的原因当这些类打算用于多线程代码时,它们会从pthreads开始。

所以,一个例子;因为A,B和C有点抽象;)

如果我们想象您的后端应用程序负责注册新用户;更新数据库和发送电子邮件,创建他们的小猫头像(显然),并做一些其他繁重的工作。

我们做出以下假设:

  • 在您的应用程序的某处,您有一个Pool,因为这是一种很好的做法,
  • 您有一些专门用于后台工作的课程(Threaded
  • 你有一些正常的PHP类做正常的事情

邮件程序

线程化的代码

class Mailer extends Threaded {

    public function __construct($email, $subject, $message) {
        $this->email = $email;
        $this->subject = $subject;
        $this->message = $message;
    }

    public function send() {
        if (!mail($this->email, $this->subject, $this->message)) {
            throw new \RuntimeException(
                "the mailman is a failure ...");
        }
    }

    public function run() {
        /* when I am submitted to a 
            Pool or Worker, I will send the email */
        $this->send();
        /* alternatively, Mailer could be a Thread
            but I won't encourage you to be wasteful ;) */
    }

    protected $email;
    protected $subject;
    protected $message;
}

任意代码

没有线程的应用程序代码

class Something {
    public function thing() {

    }
}

申请代码

使用任意线程代码的代码

class Register {

    public function __construct(Pool $pool, Mailer $mail, Something $some) {
        $this->pool = $pool;
        $this->mail = $mail;
        $this->some = $some;
    }

    public function doRegistration() {
        /* ... do registration things ... */
        $this->some->thing();

        /* send the email in the background */
        $this->pool
            ->submit($this->mail);

        /* do the next thing */
        $this->some->thing();
    }

    protected $pool;
    protected $mail;
    protected $other;
}

实施例

/* somewhere else in the application */
$pool     = new Pool(2);
$some     = new Something();

/* here */
$mail     = new Mailer("krakjoe@php.net", "oi", "look here");
$register = new Register($pool, $mail, $some);
$register->doRegistration();

/* somewhere else suitable in the application */
$pool->shutdown();

http://pastebin.com/PvaZr2pH

注意:没有必要在后台线程中发送电子邮件,这只是示例代码

进一步阅读: