php面向对象

一路走来也见识了几种语言的面向对象,最古怪的是javascript的,但是发现都没有深入,现在想系统的记录下php面向对象的学习


image.png

类名的每个单词首字母大写

类可以通过extends继承另一个类,不支持多继承,可以在子类中重写父类中的属性和方法,方法重写参数必须保持一致

可以通过 对象名->属性或$this->属性来调用非静态属性
对象名::属性或$self::属性来调用静态属性

<?php
class Person{
    public $food = "apple"; //属性
    public function eat(){
        echo "i like eat ".$this->food;
    }
}
$doctor = new person();
$doctor->eat();
?>

php是单继承


static  在两个对象之间共享相同的属性,修改一个,另一个也相应修改
public static $name = 'weiwei';
在类中使用静态成员,使用self::静态成员来调用,在类的外部使用静态成员,使用类名::静态成员来调用,使用self可以访问类自身的成员方法,访问常量可以不加$符号
使用parent关键字可以访问父类的静态成员,还可以访问父类中被子类重写的方法
静态方法只能访问静态属性
不能用$this->访问静态属性,方法
静态方法内部不能使用$this

(1)随机给定长度给定类型字符串类,类型有数字,字母,字母加数字
class RandStr{
    public $length;
    public $para_type;

    public function __construct($length=7,$para_type=2){
        $this->length = $length;
        $this->para_type = $para_type;
    }
    public function generateRandStr(){
        switch ($this->para_type) {
            case 1:
                $string = join('',array_rand(array_flip(range(0,9)),$this->length));
                echo $string;
                break;
            case 2;
                $string = join('',array_rand(array_flip(range('a','z')),$this->length));
                echo $string;
                break;
            default:
                $string = join('',array_rand(array_flip(array_merge(range(0,9),range('a','z'))),$this->length));
                echo $string;
                break;
        }
    }
}

$weidapao = new RandStr(5,3);
$weidapao->generateRandStr();
(2)parent的使用
class house{
    private $wallcolor;
    private $window_num;

    public function __construct($wallcolor = 'white',$window_num = 2){
        $this->wallcolor = $wallcolor;
        $this->window_num = $window_num;
    }
    public function house_info(){
        $info = "房屋的基本信息有:"."墙壁颜色:".$this->wallcolor."<br>窗户数量:".$this->window_num;
        return $info;
    }
}


class library extends house{
    private $rect_size;
    public function __construct($rect_size = 400){
        parent::__construct();
        $this->rect_size = $rect_size;
    }
    public function library_info(){
        $info = parent::house_info();
        echo $info."占地面积为:".$this->rect_size;
    }
}
//$myhouse = new house('blue',3);
//$myhouse->house_info();
$library = new library(500);
$library->library_info();      //继承的方法可以和子类的方法名不同
(3)abstract抽象类
  • 当该类至少有一个抽象方法,该类为抽象类
  • 抽象类不能被实例化,只是定义了调用方式,没有具体实现
  • 子类继承的时候必须实现所有的抽象方法
  • 子类在实现父类方法的时候,方法可见性可以与父类相同或者宽松
  • 为子类提供一种规范

(图形面积周长的计算)

<?php
header("content-type:text/html;charset=utf-8");
//当运行显示文件下载,可能是text/html顺序错误
/*
定义抽象类Shape
protected 属性 $width $height
protected 方法 getArea() getPrimeter()
矩形 Rectangle 继承 Shape
圆形 Circle 继承 Shape
*/
 abstract class Shape{
     //有抽象方法就必须声明为抽象类
    protected $width;
    protected $height;
    public function __construct($width,$height){
        $this->width = $width;
        $this->height = $height;
    }
    abstract protected function getArea();
    abstract protected function getPrimeter();
    //抽象方法不加大括号{},抽象方法后要加分号
}

class Rectangle extends Shape{
    public function getArea(){
        echo "矩形面积为:".($this->width * $this->height);
    }
    public function getPrimeter(){
        echo "矩形周长为:".(($this->width) * 2 + ($this->height) * 2)."<br>";
    }
    //涉及到计算部分的字符串连接,要对计算部分加括号
}


class Circle extends Shape{
    private $radius;

    public function __construct($radius){
        $this->radius = $radius;
    }
    //因为涉及到传参数量不同,因此重写构造函数
    public function getArea(){
        echo "圆形面积为:".(3.14 * $this->radius * $this->radius)."<br>";
    }
    public function getPrimeter(){
        echo "圆形周长为:".(3.14 * $this->radius *2)."<br>";
    }
}

$playground = new Rectangle(20,30);

$playground->getArea();

$playground->getPrimeter();

$circle = new Circle(5);

$circle->getArea();

$circle->getPrimeter();

抽象类只能单继承,接口可以多继承,也可以多实现,接口里的成员字段必须是常量,而抽象类可以共享非抽象方法,也可以有其他非抽象属性字段

(4)interface接口
<?php
header("content-type:text/html;charset=utf-8");

interface english{
    public function eng_score();
}

interface history{
    public function his_score();
}

class Student implements history,english{
    public function eng_score(){
        echo "我的英语得了99分<br>";
    }
    public function his_score(){
        echo "我的历史得了88分";
    }
}

$weidapao = new Student;

$weidapao->eng_score();
$weidapao->his_score();
  • 类可以实现多个接口

  • 接口继承多个接口,类必须实现所有实现接口的方法
<?php
header("content-type:text/html;charset=utf-8");

interface farther{
    public function far_info();
}
interface mother{
    public function mom_info();
}

interface familyMember extends farther,mother{
 public function all_info();
}

class Son implements familyMember{
    public function all_info(){
        echo "我们是幸福的一家人<br>";
    }
    public function far_info(){
        echo "我是伟大炮的爸爸<br>";
    }
    public function mom_info(){
        echo "我是伟大炮的妈妈<br>";
    }
}

$weiwei = new Son;   //如果不传参,可以不加括号
$weiwei->all_info();
$weiwei->far_info();
$weiwei->mom_info();

(5)static静态
<?php
header("content-type:text/html;charset=utf-8");
class Plane{
    static public $boom = 0;
    static private $engine = 2;

    static public function plane_info(){
        echo "<br>炸弹的数量为:".self::$boom."<br>发动机的数量为:".self::$engine; //使用self::属性名   属性名需要加$
    }
    public function no_static_plane_info(){
        echo "<br>非静态方法调用静态属性,发动机的数量为:".self::$engine;
    }
}

$f4 = new Plane;
echo "类外调用,炸弹的数量为:".Plane::$boom;
$f4->plane_info();
$f4->no_static_plane_info();   //非静态方法可以调用静态属性

(6)多态
<?php
header("content-type:text/html;charset=utf-8");
interface Sports{
    public function sport_type();
    public function sport_way();
}

class BasketBall implements Sports{
    public function sport_type(){
        echo "运动类型是打篮球<br>";
    }
    public function sport_way(){
        echo "打篮球是五人对五人,一个球<br>";
    }
}

class FootBall implements Sports{
    public function sport_type(){
        echo "运动类型是踢足球<br>";
    }
    public function sport_way(){
        echo "踢足球是十一人对十一人,一个球,两个守门员<br>";
    }
}

class Person{
    public function whichSport($type,$way){
         $type."<br>".$way;
    }
}

$basketball = new BasketBall;
$football = new FootBall;

$weidapao = new Person;
//根据传入对象不同,不同对象调用相同方法产生不同的结果
$weidapao->whichSport($basketball->sport_type(),$football->sport_way());
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容