设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] PHP类实例教程(二十四):PHP5类中的多态

[复制链接]

尚未签到

发表于 2017-4-10 09:33:27 | 显示全部楼层 |阅读模式
  多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。
  我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
  一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。
  所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。
  简单的说,一个类拥有其父类、和已实现接口的身份。
通过实现接口实现多态
  <?class User{ // User接口public function  getName() {}}class NormalUser extends User{ // 继承自User类private $name;public function getName() {return $this->name;}public function setName($_name) {$this->name = $_name;}}class UserAdmin{ //操作public static function  ChangeUserName(User $_user, $_userName) {$_user->setName($_userName);}}$normalUser = new NormalUser();UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例echo $normalUser->getName();?>
使用接口与组合模拟多继承
  通过组合模拟多重继承。
  在PHP中不支持多重继承,如果我们向使用多个类的方法而实现代码重用有什么办法么?
  那就是组合。在一个类中去将另外一个类设置成属性。
  下面的例子,模拟了多重继承。
接口实例
  写一个概念性的例子。 我们设计一个在线销售系统,用户部分设计如下: 将用户分为,NormalUser, VipUser, InnerUser 三种。要求根据用户的不同折扣计算用户购买产品的价格。并要求为以后扩展和维护预留空间。
   <?phpinterface User{public function getName();public function setName($_name);public function getDiscount();}abstract class AbstractUser implements User{private $name = "";protected  $discount = 0;protected  $grade = "";function __construct($_name) {$this->setName($_name); }function getName() {return $this->name;}function setName($_name) {$this->name = $_name;}function getDiscount() {return $this->discount;}function getGrade() {return $this->grade;}}class NormalUser extends AbstractUser{protected $discount = 1.0;protected $grade = "Normal";}class VipUser extends AbstractUser{protected $discount = 0.8;protected $grade = "VipUser";}class InnerUser extends AbstractUser{protected $discount = 0.7;protected $grade = "InnerUser";}interface Product{function getProductName();function getProductPrice();}interface Book extends Product{function getAuthor();}class BookOnline implements Book{private $productName;protected $productPrice;protected $Author;function __construct($_bookName) {$this->productName = $_bookName;}function getProductName() {return $this->productName;}function getProductPrice() {$this->productPrice = 100;return $this->productPrice;}public function getAuthor() {$this->Author = "chenfei";return $this->Author;}}class Productsettle{public static function finalPrice(User $_user, Product $_product, $number) {$price = $_user->getDiscount() * $_product->getProductPrice() * $number;return $price;}}$number = 10;$book = new BookOnline("设计模式");$user = new NormalUser("tom");$price = Productsettle::finalPrice($user, $book, $number);$str = "您好,尊敬的" . $user->getName() . "<br />";$str .= "您的级别是" . $user->getGrade() . "<br />";$str .= "您的折扣是" . $user->getDiscount() . "<br />";$str .= "您的价格是" . $price;echo $str;?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362723-1-1.html 上篇帖子: php > 根据远程图片URL 生成缩略图 下篇帖子: [zz]discuzX1核心文件class_core.php分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表