面向对象编程的三大特性:
封装,继承,多态;
抽象;研究问题的方法;
封装;通过访问修饰符控制用户的权限 对成员属性的访问
public,private,protected;
public 表示全局,可以在类的内部,外部,子类中使用
protected 表示受到保护的,可以在本类,子类中使用
private 表示私有的,只能在本类中使用
通常提供public方法去访问protected和private变量
可用__set() __get()方法来访问protected和private的属性;
(不推荐)
继承:
提高代码的复用性,减少代码的冗余度;
抽取类的共有属性和方法,形成父类,让别的类继承它;
<?php
//应用场景 开发一套学生管理系统(pupil,graduate,)
class stu{
public $name;
protected $age;
protected $grade;
public function showinfo(){
echo $this->name."||".$this->age;
}
}
class pupil extends stu(){
public function tesing(){
echo "小学生考试";
}
}
class graduate extends stu(){
public function tesing(){
echo "研究生考试";
}
}
$stu1=new pupil();
$stu2=new graduate();
?
从上面代码我们可以看出
所谓继承就是一个子类 通过 extends 父类 把父类中的(public、protected)
属性和方法继承下来
不能继承private属性和方法
语法
class 类名 extends 父类名{
}
当创建子类对象的时候,默认不会自动调用父类的构造方法;
在子类中调用父类中的构造方法或者成员方法(protected/public)
语法是:父类名::方法名 或者 parent::方法名 变量直接用$this->变量名
重载:
函数名一样,通过函数的参数个数或者是参数类型不同,达到调用
同一个函数名,但是可以区分不同的函数;
php5中通过提高的“魔术”函数,以实现重载;
<?php
class aa{
public function test1($p){
echo "world";
}
public function test2($p){
echo "hello";
}
//__call($method,$p) $method是接受test $p是接受参数;
function __call($method,$p){
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}
else if(count($p)==2){
$this->test2($p);
}
}
}
}
$p=new aa();
$p->test(12);
//$p->test(12,23);
?>
php中的魔术常量:
__LINE__查看所在行数;
__FILE__查看文件所在的路径;
__CLASS__查看所在方法在哪个类;
__FUNCTION__查看目前所在哪个方法;
方法的重写/方法的覆盖(override)
当一个父类知道所有的子类都可以抽象出一个方法,但父类不能
确定该方法的写法,就可以用到子类覆盖;
<?php
//抽象一个animal类
class animal{
public $name;
protected $price;
function cry(){
}
}
class dog extends animal{
function cry(){
//覆盖
echo "小狗叫";
}
}
class pig extends animal{
}
//创建一只狗
$dog1=new dog();
$dog1->cry();
?>
细节:子类的方法名和参数都是一样的,
在重载的时候 访问修饰符可以不一样 但是子类的访问范围>=父类的范围;
多态:体现在子类没有覆盖父类的方法则调用父类的方法,覆盖了就调用自己的;
封装,继承,多态;
抽象;研究问题的方法;
封装;通过访问修饰符控制用户的权限 对成员属性的访问
public,private,protected;
public 表示全局,可以在类的内部,外部,子类中使用
protected 表示受到保护的,可以在本类,子类中使用
private 表示私有的,只能在本类中使用
通常提供public方法去访问protected和private变量
可用__set() __get()方法来访问protected和private的属性;
(不推荐)
继承:
提高代码的复用性,减少代码的冗余度;
抽取类的共有属性和方法,形成父类,让别的类继承它;
<?php
//应用场景 开发一套学生管理系统(pupil,graduate,)
class stu{
public $name;
protected $age;
protected $grade;
public function showinfo(){
echo $this->name."||".$this->age;
}
}
class pupil extends stu(){
public function tesing(){
echo "小学生考试";
}
}
class graduate extends stu(){
public function tesing(){
echo "研究生考试";
}
}
$stu1=new pupil();
$stu2=new graduate();
?
从上面代码我们可以看出
所谓继承就是一个子类 通过 extends 父类 把父类中的(public、protected)
属性和方法继承下来
不能继承private属性和方法
语法
class 类名 extends 父类名{
}
当创建子类对象的时候,默认不会自动调用父类的构造方法;
在子类中调用父类中的构造方法或者成员方法(protected/public)
语法是:父类名::方法名 或者 parent::方法名 变量直接用$this->变量名
重载:
函数名一样,通过函数的参数个数或者是参数类型不同,达到调用
同一个函数名,但是可以区分不同的函数;
php5中通过提高的“魔术”函数,以实现重载;
<?php
class aa{
public function test1($p){
echo "world";
}
public function test2($p){
echo "hello";
}
//__call($method,$p) $method是接受test $p是接受参数;
function __call($method,$p){
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}
else if(count($p)==2){
$this->test2($p);
}
}
}
}
$p=new aa();
$p->test(12);
//$p->test(12,23);
?>
php中的魔术常量:
__LINE__查看所在行数;
__FILE__查看文件所在的路径;
__CLASS__查看所在方法在哪个类;
__FUNCTION__查看目前所在哪个方法;
方法的重写/方法的覆盖(override)
当一个父类知道所有的子类都可以抽象出一个方法,但父类不能
确定该方法的写法,就可以用到子类覆盖;
<?php
//抽象一个animal类
class animal{
public $name;
protected $price;
function cry(){
}
}
class dog extends animal{
function cry(){
//覆盖
echo "小狗叫";
}
}
class pig extends animal{
}
//创建一只狗
$dog1=new dog();
$dog1->cry();
?>
细节:子类的方法名和参数都是一样的,
在重载的时候 访问修饰符可以不一样 但是子类的访问范围>=父类的范围;
多态:体现在子类没有覆盖父类的方法则调用父类的方法,覆盖了就调用自己的;