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程序设计有所帮助。