💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
在PHP5以前的bai版本中,构du造函数的名称必须与类名相同 PHP5以及之后的版本,构造函数用__construct()方法来声明 为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜索一个与类名相同名的构造方法。 如果__construct( )的方法、与类名相同名的构造方法同时存在的话,优先使用__construct( )的方法。 ``` <?php //在类的外部无法直接获取非共有属性(即私有和受保护的)即只有public的属性才能在类的外部$p->共有属性名 class Person { public $name = '苍苍'; // 公共属性 protected $age = 28; // 受保护的属性 类外无法直接调用 private $sanwei = '91-58-89'; // 私有的属性 类外无法直接调用 //静态变量 static public $num = 0; //常量 无$直接以大写字母开头,且一单定义无法修改 const NUM = 0; public function getNum(){ self::$num++; //类内部调用静态属性 echo self::$num; } } // 实例化类 $p = new Person; // 类外部调用公共属性 echo $p->name; // 类外部调用静态属性 echo Person::$num; // 类外部调用类常量 echo Person::NUM; // 类外调用受保护的属性 // echo $p->age; // Fatal error: Cannot access protected property Person::$age不能访问受保护的属性 // 类外调用私有的属性 echo $p->sanwei; // Fatal error: Cannot access private property Person::$sanwei 不能访问私有的属性 //在类的内部任意获取非共有属性(即私有和受保护的) //在类外实例化调用非公有属性,需要一个共有的方法包装在该方法里用$this->属性名获取非公有属性,然后在通过调用该共有方法输出非公有属性和方法 class Person { public $name = '柳岩'; protected $age = 32; private $sanwei = '83-61-89'; // 定义方法 public function say() { // 访问公有和非公有属性 echo "{$this->name}姐姐说:她今年{$this->age}岁,她的傲人的三围是{$this->sanwei}"; } } // 实例化Person类 $p = new Person; // 调用方法 $p->say(); class Person { // 公有方法 public function demo1() { echo '共有方法 <br>'; } protected function demo2() { echo '受保护的非公有方法 <br>'; } private function demo3() { echo '私有的非公有方法 <br>'; } public function demo4() { if($state=='vip'){ // 调用受保护的方法和私有方法 $this->demo2(); $this->demo3(); }else{ echo'没有权限'; } } } // 实例化Person类 $p = new Person; $p->demo1();//输出 公有方法 // 外部获取受保护的方法 //$p->demo2(); //Fatal error: Call to protected method 不能在类外获取受保护的方法 // 外部获取私有的方法 //$p->demo3(); //Fatal error: Call to private method Person::demo3() 不能再类外调用私有的方法 $state='vip';//设置 $p->demo4(); //输出:受保护的非公有方法 私有的非公有方法 //子类重写父类0: class Person { public $name; public $age; public $sex; public function __construct($name, $age, $sex) { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function demo() { echo 'hello world+++<br>'; } } class Girl extends Person { public $hair = '100cm'; public function demo() { echo '旭旭的妆好美<br>'; } // 子类和父类中的构造方法有公共的地方 public function __construct($name, $age, $sex, $hair) { /* $this->name = $name; $this->age = $age; $this->sex = $sex; */ // 通过parent调用父类的方法 parent::__construct($name, $age, $sex); // 子类新添加的值 $this->hair = $hair; // 调用父类的demo()方法 parent::demo();//hello world+++ // 调用自身的方法 $this->demo();//旭旭的妆好美 } } // 当类被实例化的时候,进行初始化赋值 // $p = new Person('静静', 30, '欧巴'); $g = new Girl('旭旭', 20, '靓女', '100cm'); var_dump($g);//object(Girl)#1 (4) { ["hair"]=> string(5) "100cm" ["name"]=> string(6) "旭旭" ["age"]=> int(20) ["sex"]=> string(6) "靓女" } $g->demo();//旭旭的妆好美 //输出:hello world+++ //旭旭的妆好美 //object(Girl)#1 (4) { ["hair"]=> string(5) "100cm" ["name"]=> string(6) "旭旭" ["age"]=> int(20) ["sex"]=> string(6) "靓女" } 旭旭的妆好美 //子类重写父类1: //父类 class Person{ public $name; public $age; public $sex; public function __construct($mingzi='', $nianling=null, $xingbie='男'){ $this->name=$mingzi; $this->age=$nianling; $this->sex=$xingbie; } public function fulei(){ echo'父类的共有方法'; } } //子类 class son extends person{ public $size=21; //总结:子类覆盖重写父类其实就是在函数的基础上添加更多的参数 public $a='a'; public function __construct($mingzi='', $nianling=null, $xingbie='女'){ parent::__construct($mingzi, $nianling, $xingbie);//这段代码的作用是减轻重复代码的量父类中只定义了三个参数如果定义了成百上千呢在子类覆盖是全部写上就有点麻烦了这时我们就可以用这个代码就全部重写覆盖父类的代码了 } } $instance_person=new person('lichihua','26','男');//实例化父类 var_dump($instance_person);echo'<br>'; $instance_son=new son('aaa', 'bbb', 'cc');//实例化子类 var_dump($instance_son); //子类重写父类2: class parent{ public function demo($a){ } } class son extends parent { public function demo($b){ } } //总结得出重写的属性和方法的名必须一样如demo方法如果demo是私有的那么子类也必须是私有的;但是参数可以随便没有限制如$a和子类的$b; class parent{ | class parent{ public function demo($a){ | producted function demo($a,$c=''){ } | } } | } class son extends parent { | class son extends parent { public function demo($b,$c=null){ | producted function demo($b,$e=null){ } | } } | } | //总结得出 子类的参数的个数必须≥(大于等于)父类的参数个数,但是子类多余出来的参数必须有默认值;并且默认参数的值不同也是可以的; class foo { public function test(stdClass $a, array $z){ } } class bar extends foo { public function test(stdClass $b, array $c){ } } //总结得出 php是弱类型语言所以重写父类方法只涉及对象类型和数组类型 ```