我有一个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类中做任何改动。
我卡在那里!!我怎么能这样做?
提前致谢!!
答案 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
)线程化的代码
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();
注意:没有必要在后台线程中发送电子邮件,这只是示例代码
进一步阅读: