Php学习之trait的使用

说通俗点,PHP 中使用 trait 关键字是为了解决一个类既想集成基类的属性和方法,又想拥有别的基类的方法,而 trait 一般情况下是和 use 搭配使用的。本文和大家分享的就是php trait 使用相关内容,一起来看看吧,希望对大家 学习php有所帮助。
  <?php
   trait Drive {
   public $carName = 'trait';
   public  function  driving() {
   echo "driving {$this->carName}\n";
  }
  }
   class  Person {
   public  function  eat() {
   echo "eat\n";
  }
  }
   class  Student  extends  Person {
   use  Drive;
   public  function  study() {
   echo "study\n";
  }
  }
  $student =  new Student();
  $student->study();
  $student->eat();
  $student->driving();
  ?>
  输出结果如下:
  study
  eat
  driving  trait
  上面的例子中,Student 类通过继承 Person ,有了 eat 方法,通过组合 Drive ,有了 driving 方法和属性 carName
   如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?
  <?php
   trait Drive {
   public  function  hello() {
   echo "hello drive\n";
  }
   public  function  driving() {
   echo "driving from drive\n";
  }
  }
   class  Person {
   public  function  hello() {
   echo "hello person\n";
  }
   public  function  driving() {
   echo "driving from person\n";
  }
  }
   class  Student  extends  Person {
   use  Drive;
   public  function  hello() {
   echo "hello student\n";
  }
  }
  $student =  new Student();
  $student->hello();
  $student->driving();?>
  输出结果如下:
   hello student
  driving from drive
  因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait 的 方法,而  trait  的方法又覆盖了基类中的方法。
  如果要组合多个Trait ,通过逗号分隔  Trait 名称:
   use Trait1, Trait2;
  如果多个Trait 中包含同名方法或者属性时,会怎样呢?答案是当组合的多个 Trait 包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
  <?php trait Trait1 {
   public  function  hello() {
   echo "Trait1::hello\n";
  }
   public  function  hi() {
   echo "Trait1::hi\n";
  }
  } trait Trait2 {
   public  function  hello() {
   echo "Trait2::hello\n";
  }
   public  function  hi() {
   echo "Trait2::hi\n";
  }
  } class  Class1 {
   use  Trait1Trait2;
  }?>
  输出结果如下:
  PHP Fatal  error:  Trait method hello has  not been applied, because there are collisions  with other trait methods  on Class1  in~/php54/trait_3.php  on line 20
  使用insteadof as 操作符来解决冲突, insteadof 是使用某个方法替代另一个,而 as 是给方法取一个别名,具体用法请看代码:
  <?php trait Trait1 {
   public  function  hello() {
   echo "Trait1::hello\n";
  }
   public  function  hi() {
   echo "Trait1::hi\n";
  }
  } trait Trait2 {
   public  function  hello() {
   echo "Trait2::hello\n";
  }
   public  function  hi() {
   echo "Trait2::hi\n";
  }
  } class  Class1 {
   use  Trait1Trait2 {
   Trait2:: hello  insteadof  Trait1;
  Trait1::hi  insteadof Trait2;
  }
  } class  Class2 {
   use  Trait1Trait2 {
   Trait2:: hello  insteadof  Trait1;
  Trait1::hi  insteadof Trait2;
  Trait2::hi  as hei;
  Trait1::hello  as hehe;
  }
  }
  $Obj1 =  new Class1();
  $Obj1->hello();
  $Obj1->hi(); echo "\n";
  $Obj2 =  new Class2();
  $Obj2->hello();
  $Obj2->hi();
  $Obj2->hei();
  $Obj2->hehe();?>
  输出结果如下:
   Trait2::hello Trait1::hi
   Trait2::hello Trait1::hi Trait2::hi Trait1::hello
   as关键词还有另外一个用途,那就是修改方法的访问控制:
  <?php
   trait Hello {
   public  function  hello() {
   echo "hello,trait\n";
  }
  }
   class  Class1 {
   use  Hello {
   hello  as  protected;
  }
  }
   class  Class2 {
   use  Hello {
   Hello:: hello  as  private  hi;
  }
  }
  $Obj1 =  new Class1();
  $Obj1->hello(); #  报致命错误,因为 hello 方法被修改成受保护的
  $Obj2 =  new Class2();
  $Obj2->hello(); #  原来的 hello 方法仍然是公共的
  $Obj2->hi();  #  报致命错误,因为别名 hi 方法被修改成私有的 ?>
  Trait  也能组合 Trait Trait 中支持抽象方法、静态属性及静态方法,测试代码如下:
  <?php trait Hello {
   public  function  sayHello() {
   echo "Hello\n";
  }
  } trait World {
   use  Hello;
   public  function  sayWorld() {
   echo "World\n";
  }
   abstract  public  function  getWorld();
   public  function  inc() {
   static $c = 0;
  $c = $c + 1;
   echo "$c\n";
  }
   public  static  function  doSomething() {
   echo "Doing something\n";
  }
  } class  HelloWorld {
   use  World;
   public  function  getWorld() {
   return 'get World';
  }
  }
  $Obj =  new HelloWorld();
  $Obj->sayHello();
  $Obj->sayWorld(); echo $Obj->getWorld() . "\n";
  HelloWorld::doSomething();
  $Obj->inc();
  $Obj->inc();?>
  输出结果如下:
   Hello
  World
  get World
Doing something
1
2
来源:简书

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
应用背景为变电站电力巡检,基于YOLO v4算法模型对常见电力巡检目标进行检测,并充分利用Ascend310提供的DVPP等硬件支持能力来完成流媒体的传输、处理等任务,并对系统性能做出一定的优化。.zip深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值