【代码学习】PHP面向对象之封装与继承
一、封装(访问控制)
就是将属性私有,并提供公有的setter放置与getter取值方法
注:封装是进行访问控制,不是拒绝访问
public(公有) protected(受保护) private(私有)
===========================================================
在本类中 Y Y Y
在子类中 Y Y N
在类外边 Y N N
使用private关键字修饰就是实现了对成员的私有封装。封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用 $this访问
1、设置私有属性
<?php
class info {
private $name;
private $sex;
private $age; public function __construct($name="SQYY", $sex="男",$age="1") {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//在类中声明一个走路的方法,调用两个内部的私有方法完成
function run() {
echo $this ->name .'在走路时' .$this ->leftLeg() .'再' .$this ->rightLeg().'<br>';
}
//声明一个迈左腿的方法,被封装,所以只能内部使用
private function leftLeg() {
return "迈左腿";
}
//声明一个迈右腿的方法,被封装,所以只能内部使用
private function rightLeg() {
return "迈左腿";
}
//实例化一个对象
$person1 = new info();
$person1 -> run(); //run没有被封装,可以在外部调用使用
$person1 -> name='李四'; //name属性被封装,不能再对象外部给私有属性赋值
$person1 -> leftLeg(); //leftLeg()方法被封装,不能在对象外面调用对象的私有方法
}
?>
2、私有成员的访问
<?php
class Person {
public $name; //第一个成员属性$name定义人的名字,此属性被封装
private $sex; //第二个成员属性$sex定义人的性别,此属性被封装
function __construct($name='SQYY',$sex='男'){
$this->name=$name;
$this->sex=$sex;
}
public function setName($name ) { //通过此方法设置属性name的值
$this->name=$name; //为对象的私有属性赋值
}
public function getName(){ //通过此方法获取属性name的值
return $this->name; //返回当前的私有名字属性
}
public function setSex($sex) { //通过此方法设置属性sex的值
if($sex=="男" || $sex=="女") //如果传入合法的值才为私有的属性赋值
$this->sex=$sex; //条件成立则将参数传入的值赋给私有属性
}
public function getSex(){ //通过此方法获取属性$sex的值
return $this->sex; //返回当前的私有性别属性
}
public function info(){
echo '我的名字:' .$this -> name. ',我的性别:' .$this ->sex;
}
}
$person1 = new Person('张三','女');
$person1 ->info(); //输出 我的名字:张三,我的性别:女
?
如果没有使用private封装的成员属性,则可以随意被赋值。如果对私有的成员属性通过公有的方法访问,则可以在公有的方法加一些限制条件来达到封装的目的。
二、继承
继承的使用场景:当别人有 自己没有 去继承那个人的
继承的格式: class A extends B{}
当A类去继承了B类之后 A类中就拥有了B类中所有的成员属性和 成员方法,但是 除了私有成员之外
访问权限 public protected private
在类的外部 OK NO NO
在子类中 OK OK NO
1、继承属性(父类的私有成员只能在本类使用,子类不能访问)
<?php
//声明一个类作为父类使用,将他的成员都声明为私有的
class Myclass{
public $var1 = 100; //声明一个私有的成员属性并赋值100
//声明一个成员方法,使用private关键字设置为私有
public function printHello(){
echo 'Hello<br>';
}
}
//声明一个子类Myclass类的子类师试图访问父类中的私有成员
class Myclass2 extends Myclass{
function useProperty(){
echo '输出从父类及成果来的成员属性值' .$this ->var1 .'<br>'; //访问父类中的私有属性
$this -> printHello(); //访问父类中的私有方法
}
}
$subObj = new Myclass2;
$subObj -> useProperty();
?>
2、单继承
PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,但一个类可以被多个类继承。
如类B 继承了类A,类C又继承了类B,那么类C也间接继承了类A
<?php
class P_H_P extends J_A_V_A{
public function php(){
echo "我正在编写php程序";
}
}
class J_A_V_A{
public function java(){
echo "我正编写java程序";
}
}
// 学生的类
class stu extends P_H_P{
}
// 实例化对象
$stus = new stu();
$stus->php();
$stus->java();
?>
3、子类中重载父类的方法
如果在子类中拥有一个和父类中同名的成员方法时,调用该方法 调用的是子类的成员方法 而不是父类中的
调用父类中被覆盖的成员方法: parent::方法名
<?php
header('Content-type:text/html;charset=utf-8');
// 调用父类中的成员
//定义一个wifi
define('WIFI',false);
//父类
class Phone{
//成员属性
public $brand = "普通手机";
//成员方法
public function call(){
echo "我正在打电话呢";
}
}
//子类
class SmartPhone extends Phone{
//成员属性
public $brand = "智能手机";
// 成员方法
public function call(){
if(WIFI){
echo "我正在使用wifi打电话呢";
}else{
// 调用父类的方法
parent::call();
echo '怎么了?';
}
}
}
// 实例化对象
$xm = new SmartPhone();
$xm->call();
?>
当定义的WIFI为false时 输出 我正在打电话呢怎么了?
当第义的WIFI为true时 输出 我正在使用wifi打电话呢
最新文章
- iOS 之消息推送(个推)---个人小结
- UVALive 7146 Defeat the Enemy(贪心+STL)(2014 Asia Shanghai Regional Contest)
- Servlet-RequestDispatcher.forward方法
- javascript的原型与继承(2)
- PHP基础18:require和include
- visual2012 快捷键
- Python学习教程(learning Python)--1.4 Python数据处理基础
- log4j自动生成日志文件配置
- BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分 - 点权剖分 - 单点权修改)
- DevExpress之lookupedit
- 整理:Google jQuery 引用地址大全和方法(转)
- svn修改密码跟账户
- 什么是REST架构 - z
- JavaScript基础知识----document对象
- U8Linux磁盘与文件系统管理
- js&;jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
- Django 创建admin账户
- java基础之二分法查找
- java中的int与byte的转化
- selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见