一路走来也见识了几种语言的面向对象,最古怪的是javascript的,但是发现都没有深入,现在想系统的记录下php面向对象的学习
类名的每个单词首字母大写
类可以通过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());