一、封装性:

目的:为了使类更加安全。

做法:1设置私有成员

2在类中建方法,访问私有成员

3在方法里边加控制(if)


私有成员访问的两种方法:

方法一:set(可写) get(可读)做方法(可读可写)

class Person
{
private $name;
private $sex;
private $age;//全部使用private进行封装
function __construct($n,$s,$a)
{
$this->name=$n;
$this->sex=$s;
$this->age=$a;
}
//获取成员name的值
function Getname()
{
return $this->name;
}
//设置性别,并加控制
function Setsex($s)
{
if($s=="男"||$s=="女")//对输入加控制,只有输入合法字符,才能对私有成员赋值;
{
$this->sex=$s;
}
}
//设置年龄,并加控制,防止输入非法字符
function Setage($a)
{
if($a>18&&$a<80)
{
$this->age=$a;
}
}
function say()
{
echo "我的名字是".$this->name.",性别:".$this->sex.",年龄:".$this->age;
}
}

//通过构造函数给这个对象赋值
$ren=new Person("张三","男","30");
var_dump($ren);

//获取对象的名字
echo $ren->Getname();

//改变对象的性别
$ren->Setsex("女");
var_dump($ren);

//改变对象的年龄
//1.给个非法,是改变不了的
$ren->Setage(100);
var_dump($ren);

//2.输入合法
$ren->Setage(50);
var_dump($ren);

//调用say()
echo $ren->say();

方法二:用__SET(变量名,变量值) 、__GET(变量名) 魔术方法

class Person
{
private $name;
private $sex;
private $age;//全部使用private进行封装
function __construct($n,$s,$a)
{
$this->name=$n;
$this->sex=$s;
$this->age=$a;
}
function __get($aa)
{
if($aa=="sex")//如果获取的是性别,则返回“保密”、、注意这里是不带$符号的
{
return "保密";
}
else if($aa=="age")//如果获取的是年龄,年龄大于100时,减去10后再返回
{
if($this->age>100)
{
return $this->age-10;
}
else //年龄不大于100时,直接返回
{
return $this->age;
}
}
else //如果获取的是姓名,则直接返回
{
return $this->name;
}
}
function __set($n,$v)
{
if($n=="sex")
{
if(!$v=="男"||$v=="女")
{
return;
}
}
else if("age")
{
if($v>150||$v<0)
{
return;
}
}
else
{
$this->$n=$v;
}
}
}
$ren=new Person("张三","男",30);
//__get()自动调用,可以直接获取。
echo $ren->name."<br>";
echo $ren->sex."<br>";
echo $ren->age."<br>";

//__set()自动调用
//设置合法字符可以更改
$ren->name="张四";
$ren->age=50;
$ren->sex="男";
var_dump($ren);

//设置非法字符不可以更改
$ren->age=500;
$ren->sex="123";
var_dump($ren);

连续调用的一个例子,赋值之后,返回一个对象

class Person
{
private $name; function say()
{
echo $this->name."说话";
} function SetName($n)
{
$this->name = $n;
return $this;//返回的是$ren->SetName("张三"),并把它看成一个对象。
} } $ren = new Person();
$ren->SetName("张三")->say();//$ren->SetName("张三")因为上面的return $this;返回了,并成为了一个对象

二、继承性:关键字(extends)    子类可以继承父类的一切,特点:单继承,一个子类只能有一个父类,一个父类可以有多个子类

//子类可以继承父类的一切
//重写:override
//特点:单继承,一个子类只能有一个父类,一个父类可以派生多个子类

继承例子:

class person
{
var $name;
var $sex;
var $age;
function __construct($a,$b,$c)
{
$this->name=$a;
$this->sex=$b;
$this->age=$c;
}
function say()
{
echo "我的名字是".$this->name,"性别".$this->sex,"年龄".$this->age;
}
function run()
{
echo $this->name."正在走路";
}
} class student extends person //student继承于person的成员变量和成员方法
{
var $school;
function study()
{
echo $this->name."正在".$this->school."学习";
} }
class teacher extends student //teacher继承于student,由于student继承person,所以teacher也继承person的成员变量和成员方法
{ var $gongzi; function teaching() { echo $this->name."正在".$this->school."教学"; } }
$teacher1=new teacher("李四","女",30);
$teacher1->school="sdu+";
$teacher1->gongzi=3000; $teacher1->say();
$teacher1->study();
$teacher1->teaching();

对父类方法的重写例子(即改变原来在父类中定义的量):强类型语言中用override

class person
{
protected $name;
protected $sex;
protected $age;
function __construct($a,$b,$c)
{
$this->name=$a;
$this->sex=$b;
$this->age=$c;
}
function say()
{
echo "我的名字是:".$this->name."性别".$this->sex."年龄".$this->age;
}
}
class student extends person
{
private $school;
//覆盖父类的构造方法,对成员变量进行重写
function __construct($d,$e,$f,$g)
{
$this->name=$d;
$this->sex=$e;
$this->age=$f;
$this->school=$g;
}
function study()
{
echo $this->name."正在".$this->school."学习";
}
function say()
{
echo "我的名字是".$this->name."性别:".$this->sex."年龄".$this->age."正在".$this->school."学习";
}
}
$ren=new person("张三","男",30);
var_dump($ren);
$student=new student("李四","女",20,"胜利中学");
var_dump($student);
$student->say();

子类对父类进行重载的例子(即对父类中定义的量拿过来):php中用parent::方法名().      强类型语言中用关键字  overload 重载

class person
{
protected $name;
protected $sex;
protected $age;
function __construct($a,$b,$c)
{
$this->name=$a;
$this->sex=$b;
$this->age=$c;
}
function say()
{
echo "我的名字是".$this->name."性别".$this->sex."年龄".$this->age;
}
}
class student extends person
{
private $school;
function __construct($d,$e,$f,$g) //引用过来父类的构造函数,并修改
{
parent::__construct($d,$e,$f,$g);
$this->school=$g;
}
function study()
{
echo $this->name."正在".$this->school."学习";
}
function say()
{
parent::say(); //引用过来父类的say()方法,并在下面添加一段
echo "在".$this->school."学校上学";
} }
$ren=new person("张三","男",40);
var_dump($ren);
$student1=new student("李四","女",20,"胜利中学");
var_dump($student1);
$student1->say();

重载可以使类里面的某个方法产生多种效果,根据传入的参数不同,可以执行不同的逻辑

重载也是多态的一种,编译多态

三、多态性:
当父类引用指向子类实例的时候,由于子类对父类的方法进行了重写,父类引用在调用该方法的时候表现出的不同,称为多态
运行多态

条件
1.要有继承
2.父类引用指向子类实例
3.要有重写
4.调重写的方法

父类
/* class Ren
{
public virtual string Say()
{
return "说话";
}
} //子类
class China : Ren
{
public override string Say()
{
return "你好";
}
}
//子类
class America : Ren
{
public override string Say()
{
return "hello";
}
} //父类引用r指向子类实例
Ren r = new America();
MessageBox.Show(r.Say()); r = new China();
MessageBox.Show(r.Say()); //子类的对象可以代替父类的对象
America a = new America();
MessageBox.Show(Eat(a));
//怪兽吃人,需要一个人的参数
public string Eat(Ren r)
{
return "这个人味道不错!";
}
*/

php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;的更多相关文章

  1. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  2. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  3. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  4. Python入门-面向对象三大特性-封装

    一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 从某处调用被封装的内容 第一步:将内容封装到某处 sel ...

  5. 面向对象三大特性——封装(含property)

    一.封装概念 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 二.隐藏属性 在p ...

  6. Python()- 面向对象三大特性----封装

    封装: [封装]         隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则]      1. 将 ...

  7. Python面向对象三大特性(封装、继承、多态)

    封装 类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问:从上一篇文章中的私有属性与私有方法中的代码体现了该特性. class m ...

  8. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  9. C++面向对象三大特性

    面向对象三大特性 继承 public protected private public继承 public protected 不可见 private继承 private private 不可见 pro ...

随机推荐

  1. PowerShell工具脚本---按行数切割大文本文件

    我编写的PowerShell工具脚本,[按行数切割大(文本)文件],生成n个小文件. 主要目的是为了能够让excel快速处理.或用脚本并发处理文本. 注意: 1 如果有必要,你可以先用其他工具,把大文 ...

  2. JS小问题总结

    1. 超链接中href=#与href=javascript:void(0) 的区别  #包含了一个位置信息.默认的锚是#top 也就是网页的上端:而javascript:void(0)   仅仅表示一 ...

  3. string(Integer)类的equals和==区别和联系(验证密码的时候用得到)

    “==”在八种原始数据类型中,判断的是两边的值是否相等.对于对象类型来说,判断的是内存地址,所以为true所满足的条件就是两边的引用指向同一个对象. 比如String s1 = "abcde ...

  4. opencv中的Mat类型

    Mat类型主要是跟matlab中的数据类型一样.故用起来很方便. Mat最大的优势跟STL很相似,都是对内存进行动态的管理,不需要之前用户手动的管理内存,对于一些大型的开发,有时候投入的lpImage ...

  5. 毕向东Java基础:day09_3-4

    day09-03 1.匿名内部类的使用场景. Body{  //身体 包括心脏 private  class XinZhang{  // 心脏 可以body的成员变量.如果不想被别人访问,加上priv ...

  6. Ubuntu 14.10 下sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  7. DVRF:路由器漏洞练习靶机 Damn Vulnerable Router Firmware

    0×01 概述 这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 目前为止,该项目是基于Linksys E1550 为基础进行安装. 0×02 安装 ...

  8. ios 从网络上获取图片并在UIImageView中显示

    ios 从网络上获取图片   -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ...

  9. PHP内置的字符串处理函数

    字符串的特点    1.其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4 ...

  10. vs中附加IIS进程的调试方法

    项目运行以管理员的身份进行运行否则附加不进去: