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());
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容