PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
本文实例讲述了PHP面向对象的特性。分享给大家供大家参考,具体如下:
Demo1.php
<?php header('Content-Type:text/html;charset=utf-8;'); //创建一个电脑类 classComputer{ //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。 //public是对字段的公有化,这个字段类外即可访问,赋值和取值 public$_name='联想'; } $computer=newComputer(); $computer->_name='Dell'; echo$computer->_name; ?>
Demo2.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ //private是私有化,即对字段进行封装的操作,类外无法访问,取值和赋值都不能操作 private$_name='联想'; } $computer=newComputer(); echo$computer->_name; ?>
Demo3.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ private$_name='联想'; //这个时候我采用一个公共对外的方法来访问私有字段 //因为私有字段只能在类内访问,而对外的公共方法是类内的。 //更而公共方法又是公共的,所以类外又可访问。 publicfunction_run(){ //字段在类内调用的时候必须是类->字段,而$_name只是一个普通变量而已。 //字段在类外调用的方法是对象->字段,而类内就必须使用Computer->_name //但是在本类中,可以使用一个关键字来代替字来代替Computer,那就是$this echo$this->_name; } } $computer=newComputer(); $computer->_run(); ?>
Demo4.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ private$name; private$model; private$cpu; private$keyboard; private$show; private$zb; //必须写个对外的入口,才可以取到 publicfunctiongetName(){ return$this->name; } //必须写一个对内的入口,对私有字段进行赋值 publicfunctionsetName($name){ //这里的$name只是一个变量而已,参数而已 //$this->name才是类的字段 $this->name=$name; } } $computer=newComputer(); echo$computer->getName(); $computer->setName('Dell'); echo$computer->getName(); ?>
Demo5.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ private$_name; private$_model; private$_cpu; //当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器, //如果直接对$_name进行赋值,那么__set方法就会拦截住,就不会报错了。 //采用拦截器进行赋值和取值 //赋值 privatefunction__set($_key,$_value){ //采用$_key='_name',那么$_value='联想'; //$this->_name='联想'; $this->$_key=$_value; } //取值 privatefunction__get($_key){ return$this->$_key; //如果$_key='_name'那么$this->_name; //如果$_key='_cpu'那么$this->_cpu; //如果$_key='_model'那么$this->_model; } } $computer=newComputer(); $computer->_name='联想'; $computer->_cpu='四核'; $computer->_model='i7'; echo$computer->_name; echo$computer->_cpu; echo$computer->_model; ?>
Demo6.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ private$_name; private$_model; private$_cpu; //__set和__get方法私有了,还是可以执行,是因为 //因为目前程序的指针已经在类内了。而类内可以执行封装的方法 //类内执行私有方法,不会出现任何错误。 //它只需要间接的拦截就可以了。拦截是在内类执行的。 //说白了,__set()和__get()是PHP内置的方法,具有一定的特殊性 privatefunction__set($_key,$_value){ $this->$_key=$_value; } privatefunction__get($_key){ return$this->$_key; } } $computer=newComputer(); $computer->_name='联想'; $computer->_cpu='四核'; $computer->_model='i7'; echo$computer->_name; echo$computer->_cpu; echo$computer->_model; ?>
Demo7.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ constNAME='DELL'; } //常量的输出方法类::常量 echoComputer::NAME;//DELL ?>
Demo8.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ public$_count=0; publicfunction_add(){ $this->_count++;//$_count=$_count+1$_count++ } } //做一个累计的效果 $computer1=newComputer(); $computer1->_add(); $computer1->_add(); $computer1->_add(); echo$computer1->_count; echo'<br/>'; $computer2=newComputer(); $computer2->_add(); $computer2->_add(); $computer2->_add(); echo$computer2->_count; ?>
Demo9.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ publicstatic$_count=0; publicfunction_add(){ //如果是静态成员字段,那么就应该用self来调用,而不是$this self::$_count++; } } //做一个累计的效果 $computer1=newComputer(); $computer1->_add(); echoComputer::$_count; $computer1->_add(); echoComputer::$_count; $computer1->_add(); echoComputer::$_count; echo'<br/>'; $computer2=newComputer(); $computer2->_add(); echoComputer::$_count; $computer2->_add(); echoComputer::$_count; $computer2->_add(); echoComputer::$_count; ?>
Demo10.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ publicstatic$_count=0; publicstaticfunction_add(){ self::$_count++; } } Computer::_add(); Computer::_add(); Computer::_add(); echoComputer::$_count; ?>
Demo11.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ } $computer=newComputer(); echo$computerinstanceofComputer; ?>
Demo12.php
<?php header('Content-Type:text/html;charset=utf-8;'); //这是父类,电脑类 classComputer{ public$_name='联想'; publicfunction_run(){ echo'联想在运行!'; } } //子类,笔记本电脑类 classNoteComputerextendsComputer{ } $noteComputer=newNoteComputer(); echo$noteComputer->_name; $noteComputer->_run(); ?>
Demo13.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ public$_name='联想'; publicfunction_run(){ echo'联想在运行!'; } } classNoteComputerextendsComputer{ //我不需要父类的字段和方法,那么可以采用重写的方法覆盖掉父类的字段和方法 public$_name='Dell'; publicfunction_run(){ echo'Dell在运行!'; } } $noteComputer=newNoteComputer(); echo$noteComputer->_name; $noteComputer->_run(); ?>
Demo14.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ //私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装 protected$_name='联想'; protectedfunction_run(){ return'联想在运行!'; } } classNoteComputerextendsComputer{ publicfunctiongetTop(){ echo$this->_name; echo$this->_run(); } } $noteComputer=newNoteComputer(); $noteComputer->getTop(); ?>
Demo15.php
<?php header('Content-Type:text/html;charset=utf-8;'); classComputer{ public$_name='联想'; publicfunction_run(){ return'联想在运行!'; } } classNoteComputerextendsComputer{ //我子类已经覆盖了父类的字段和方法, //但是我又要调用父类的字段和方法,那怎么办呢? public$_name='Dell'; publicfunction_run(){ echo'Dell在运行!'; echoparent::_run(); } } $noteComputer=newNoteComputer(); echo$noteComputer->_name; $noteComputer->_run(); //DellDell在运行!联想在运行! ?>
Demo16.php
<?php header('Content-Type:text/html;charset=utf-8;'); //final如果加在类前面,表示这个类不能被继承 //finalclassComputer{ //} classComputer{ //final如果加在方法前面,表示不能够重写些方法 finalpublicfunction_run(){ } } classNoteComputerextendsComputer{ publicfunction_run(){ } } $noteComputer=newNoteComputer(); ?>
Demo17.php
<?php header('Content-Type:text/html;charset=utf-8;'); //创建一个抽象类,只要在class前面加上abstract就是抽象类了 //抽象类不能够被实例化,就是创建对象 //只在类里面有一个抽象方法,那么这个类必须是抽象类,类前面必须加上abstract abstractclassComputer{ public$_name='联想'; //抽象类里创建一个抽象方法 //抽象方法不能够实现方法体的内容 abstractpublicfunction_run(); //我在抽象类里能否创建一个普通方法 publicfunction_run2(){ echo'我是父类的普通方法'; } } //类不能够实现多继承,只支持单继承。 //抽象类是给子类用来继承的,实现一种规范和资源的共享 classNoteComputerextendsComputer{ //抽象类的抽象方法,子类必须重写,不然会报错。 //抽象类里的普通方法不需要重写,子类会直接继承下来 publicfunction_run(){ echo'我是子类的方法'; } } $noteComputer=newNoteComputer(); $noteComputer->_run(); $noteComputer->_run2(); echo$noteComputer->_name; ?>
Demo18.php
<?php /* *到底应该用抽象类还是接口呢 *如果你要继承多个接口的方法规范,那么就用接口好了。 *如果你要共享一个方法体内容,那么就用抽象类。 **/ header('Content-Type:text/html;charset=utf-8;'); //创建一个接口 //接口也不能被实例化 //接口是为了规范实现它的子类,以达到统一的目的。也可以共享数据 interfaceComputer{ //成员字段必须是变量 constNAME='成员'; //接口里的所有方法都是抽象方法,不能够写方法体 //并且接口的抽象方法不需要写abstract publicfunction_run(); publicfunction_run2(); } interfaceComputer2{ publicfunction_run3(); } //子类继承接口的说法,叫做实现,接口可以多实现 classNoteComputerimplementsComputer,Computer2{ publicfunction_run(){ echo'我重写了run'; } publicfunction_run3(){ echo'我重写了run3'; } publicfunction_run2(){ echo'我重写了run2'; } } $noteComputer=newNoteComputer(); $noteComputer->_run(); $noteComputer->_run2(); $noteComputer->_run3(); echoNoteComputer::NAME; //接口::常量 //echoComputer::NAME; ?>
Demo19.php
<?php header('Content-Type:text/html;charset=utf-8;'); //什么叫做多态,字面意思,多种形态 //一个动作由不同的人去执行,而产生不同的效果或者效果,即为多态。 //一个人通过不同的状态去执行同一种动作,形成不同的效果,也可以称作为多态。 //园丁剪修理花草 //理发师剪理发 //总裁剪裁员 //人笔记本运行win7开机了 //人台式机运行xp开机了 //创建一个接口,来规范运行的方法 interfaceComputer{ publicfunctionversion();//这个方法表示采用什么电脑 publicfunctionwork();//这台电脑是怎么运行的 } //创建一个笔记本的类实现接口 classNoteComputerimplementsComputer{ publicfunctionversion(){ echo'笔记本'; } publicfunctionwork(){ echo'可以便携式运行win7'; } } //创建一个台式机的类实现接口 classDesktopComputerimplementsComputer{ publicfunctionversion(){ echo'台式机'; } publicfunctionwork(){ echo'在工作站运行XP'; } } //创建一个用户 classPerson{ //创建一个方法来接受电脑(笔记本电脑,也可以是台式电脑) //怎么接受,将他们的对象传进来就OK啦。 publicfunction_run($type){ echo'这个人的'; $type->version(); $type->work(); } } //多态的原理,就是类都写好了,不要去修改它,只要在类外的调用参数的更改 //而最后的结果也会得到更改,那么这个就是多态。 //有一个接口,两个类,一个是笔记本的类,一个是台式机的类 //创建了笔记本 $noteComputer=newNoteComputer(); //创建台式机 $desktopComputer=newDesktopComputer(); //创建一个人 $person=newPerson(); //使用电脑 $person->_run($noteComputer);//这种传递,叫做对象引用的传递 ?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。