NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# 类基础 ``` <pre class="calibre29">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token">//在类的外部无法直接获取非共有属性(即私有和受保护的)即只有public的属性才能在类的外部$p->共有属性名</span> class <span class="token4">Person</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'苍苍'</span><span class="token3">;</span> <span class="token">// 公共属性</span> protected $age <span class="token1">=</span> <span class="token6">28</span><span class="token3">;</span> <span class="token">// 受保护的属性 类外无法直接调用</span> private $sanwei <span class="token1">=</span> <span class="token2">'91-58-89'</span><span class="token3">;</span> <span class="token">// 私有的属性 类外无法直接调用</span> <span class="token">//静态变量</span> static public $num <span class="token1">=</span> <span class="token6">0</span><span class="token3">;</span> <span class="token">//常量 无$直接以大写字母开头,且一单定义无法修改</span> const NUM <span class="token1">=</span> <span class="token6">0</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">getNum</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> self<span class="token3">:</span><span class="token3">:</span>$num<span class="token1">++</span><span class="token3">;</span> <span class="token">//类内部调用静态属性</span> echo self<span class="token3">:</span><span class="token3">:</span>$num<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化类</span> $p <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Person</span><span class="token3">;</span> <span class="token">// 类外部调用公共属性</span> echo $p<span class="token1">-</span><span class="token1">></span>name<span class="token3">;</span> <span class="token">// 类外部调用静态属性</span> echo Person<span class="token3">:</span><span class="token3">:</span>$num<span class="token3">;</span> <span class="token">// 类外部调用类常量</span> echo Person<span class="token3">:</span><span class="token3">:</span>NUM<span class="token3">;</span> <span class="token">// 类外调用受保护的属性</span> <span class="token">// echo $p->age; // Fatal error: Cannot access protected property Person::$age不能访问受保护的属性</span> <span class="token">// 类外调用私有的属性</span> echo $p<span class="token1">-</span><span class="token1">></span>sanwei<span class="token3">;</span> <span class="token">// Fatal error: Cannot access private property Person::$sanwei 不能访问私有的属性</span> <span class="token">//在类的内部任意获取非共有属性(即私有和受保护的)</span> <span class="token">//在类外实例化调用非公有属性,需要一个共有的方法包装在该方法里用$this->属性名获取非公有属性,然后在通过调用该共有方法输出非公有属性和方法</span> class <span class="token4">Person</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'柳岩'</span><span class="token3">;</span> protected $age <span class="token1">=</span> <span class="token6">32</span><span class="token3">;</span> private $sanwei <span class="token1">=</span> <span class="token2">'83-61-89'</span><span class="token3">;</span> <span class="token">// 定义方法</span> public <span class="token5">function</span> <span class="token4">say</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// 访问公有和非公有属性</span> echo <span class="token2">"{$this->name}姐姐说:她今年{$this->age}岁,她的傲人的三围是{$this->sanwei}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化Person类</span> $p <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Person</span><span class="token3">;</span> <span class="token">// 调用方法</span> $p<span class="token1">-</span><span class="token1">></span><span class="token4">say</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> class <span class="token4">Person</span> <span class="token3">{</span> <span class="token">// 公有方法</span> public <span class="token5">function</span> <span class="token4">demo1</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'共有方法 <br>'</span><span class="token3">;</span> <span class="token3">}</span> protected <span class="token5">function</span> <span class="token4">demo2</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'受保护的非公有方法 <br>'</span><span class="token3">;</span> <span class="token3">}</span> private <span class="token5">function</span> <span class="token4">demo3</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'私有的非公有方法 <br>'</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">demo4</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span>$state<span class="token1">==</span><span class="token2">'vip'</span><span class="token3">)</span><span class="token3">{</span> <span class="token">// 调用受保护的方法和私有方法</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">demo2</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">demo3</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> echo<span class="token2">'没有权限'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化Person类</span> $p <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Person</span><span class="token3">;</span> $p<span class="token1">-</span><span class="token1">></span><span class="token4">demo1</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//输出 公有方法</span> <span class="token">// 外部获取受保护的方法</span> <span class="token">//$p->demo2(); //Fatal error: Call to protected method 不能在类外获取受保护的方法 </span> <span class="token">// 外部获取私有的方法</span> <span class="token">//$p->demo3(); //Fatal error: Call to private method Person::demo3() 不能再类外调用私有的方法</span> $state<span class="token1">=</span><span class="token2">'vip'</span><span class="token3">;</span><span class="token">//设置</span> $p<span class="token1">-</span><span class="token1">></span><span class="token4">demo4</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//输出:受保护的非公有方法 私有的非公有方法</span> <span class="token">//子类重写父类0:</span> class <span class="token4">Person</span> <span class="token3">{</span> public $name<span class="token3">;</span> public $age<span class="token3">;</span> public $sex<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$name<span class="token3">,</span> $age<span class="token3">,</span> $sex<span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>name <span class="token1">=</span> $name<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>age <span class="token1">=</span> $age<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>sex <span class="token1">=</span> $sex<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'hello world+++<br>'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">Girl</span> extends <span class="token4">Person</span> <span class="token3">{</span> public $hair <span class="token1">=</span> <span class="token2">'100cm'</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'旭旭的妆好美<br>'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">// 子类和父类中的构造方法有公共的地方</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$name<span class="token3">,</span> $age<span class="token3">,</span> $sex<span class="token3">,</span> $hair<span class="token3">)</span> <span class="token3">{</span> <span class="token">/* $this->name = $name; $this->age = $age; $this->sex = $sex; */</span> <span class="token">// 通过parent调用父类的方法</span> parent<span class="token3">:</span><span class="token3">:</span><span class="token4">__construct</span><span class="token3">(</span>$name<span class="token3">,</span> $age<span class="token3">,</span> $sex<span class="token3">)</span><span class="token3">;</span> <span class="token">// 子类新添加的值</span> $this<span class="token1">-</span><span class="token1">></span>hair <span class="token1">=</span> $hair<span class="token3">;</span> <span class="token">// 调用父类的demo()方法</span> parent<span class="token3">:</span><span class="token3">:</span><span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//hello world+++</span> <span class="token">// 调用自身的方法</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//旭旭的妆好美</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 当类被实例化的时候,进行初始化赋值</span> <span class="token">// $p = new Person('静静', 30, '欧巴');</span> $g <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Girl</span><span class="token3">(</span><span class="token2">'旭旭'</span><span class="token3">,</span> <span class="token6">20</span><span class="token3">,</span> <span class="token2">'靓女'</span><span class="token3">,</span> <span class="token2">'100cm'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$g<span class="token3">)</span><span class="token3">;</span><span class="token">//object(Girl)#1 (4) { ["hair"]=> string(5) "100cm" ["name"]=> string(6) "旭旭" ["age"]=> int(20) ["sex"]=> string(6) "靓女" }</span> $g<span class="token1">-</span><span class="token1">></span><span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//旭旭的妆好美</span> <span class="token">//输出:hello world+++</span> <span class="token">//旭旭的妆好美</span> <span class="token">//object(Girl)#1 (4) { ["hair"]=> string(5) "100cm" ["name"]=> string(6) "旭旭" ["age"]=> int(20) ["sex"]=> string(6) "靓女" } 旭旭的妆好美</span> <span class="token">//子类重写父类1:</span> <span class="token">//父类</span> class <span class="token4">Person</span><span class="token3">{</span> public $name<span class="token3">;</span> public $age<span class="token3">;</span> public $sex<span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$mingzi<span class="token1">=</span><span class="token2">''</span><span class="token3">,</span> $nianling<span class="token1">=</span><span class="token5">null</span><span class="token3">,</span> $xingbie<span class="token1">=</span><span class="token2">'男'</span><span class="token3">)</span><span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>name<span class="token1">=</span>$mingzi<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>age<span class="token1">=</span>$nianling<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>sex<span class="token1">=</span>$xingbie<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">fulei</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo<span class="token2">'父类的共有方法'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//子类</span> class <span class="token4">son</span> extends <span class="token4">person</span><span class="token3">{</span> public $size<span class="token1">=</span><span class="token6">21</span><span class="token3">;</span> <span class="token">//总结:子类覆盖重写父类其实就是在函数的基础上添加更多的参数</span> public $a<span class="token1">=</span><span class="token2">'a'</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span>$mingzi<span class="token1">=</span><span class="token2">''</span><span class="token3">,</span> $nianling<span class="token1">=</span><span class="token5">null</span><span class="token3">,</span> $xingbie<span class="token1">=</span><span class="token2">'女'</span><span class="token3">)</span><span class="token3">{</span> parent<span class="token3">:</span><span class="token3">:</span><span class="token4">__construct</span><span class="token3">(</span>$mingzi<span class="token3">,</span> $nianling<span class="token3">,</span> $xingbie<span class="token3">)</span><span class="token3">;</span><span class="token">//这段代码的作用是减轻重复代码的量父类中只定义了三个参数如果定义了成百上千呢在子类覆盖是全部写上就有点麻烦了这时我们就可以用这个代码就全部重写覆盖父类的代码了</span> <span class="token3">}</span> <span class="token3">}</span> $instance_person<span class="token1">=</span><span class="token5">new</span> <span class="token4">person</span><span class="token3">(</span><span class="token2">'lichihua'</span><span class="token3">,</span><span class="token2">'26'</span><span class="token3">,</span><span class="token2">'男'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//实例化父类</span> <span class="token4">var_dump</span><span class="token3">(</span>$instance_person<span class="token3">)</span><span class="token3">;</span>echo<span class="token2">'<br>'</span><span class="token3">;</span> $instance_son<span class="token1">=</span><span class="token5">new</span> <span class="token4">son</span><span class="token3">(</span><span class="token2">'aaa'</span><span class="token3">,</span> <span class="token2">'bbb'</span><span class="token3">,</span> <span class="token2">'cc'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//实例化子类</span> <span class="token4">var_dump</span><span class="token3">(</span>$instance_son<span class="token3">)</span><span class="token3">;</span> <span class="token">//子类重写父类2:</span> class <span class="token4">parent</span><span class="token3">{</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$a<span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">son</span> extends <span class="token4">parent</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//总结得出重写的属性和方法的名必须一样如demo方法如果demo是私有的那么子类也必须是私有的;但是参数可以随便没有限制如$a和子类的$b;</span> class <span class="token4">parent</span><span class="token3">{</span> <span class="token1">|</span> class <span class="token4">parent</span><span class="token3">{</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$a<span class="token3">)</span><span class="token3">{</span> <span class="token1">|</span> producted <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$a<span class="token3">,</span>$c<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token1">|</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token1">|</span> <span class="token3">}</span> class <span class="token4">son</span> extends <span class="token4">parent</span> <span class="token3">{</span> <span class="token1">|</span> class <span class="token4">son</span> extends <span class="token4">parent</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$b<span class="token3">,</span>$c<span class="token1">=</span><span class="token5">null</span><span class="token3">)</span><span class="token3">{</span> <span class="token1">|</span> producted <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span>$b<span class="token3">,</span>$e<span class="token1">=</span><span class="token5">null</span><span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token1">|</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token1">|</span> <span class="token3">}</span> <span class="token1">|</span> <span class="token">//总结得出 子类的参数的个数必须≥(大于等于)父类的参数个数,但是子类多余出来的参数必须有默认值;并且默认参数的值不同也是可以的;</span> class <span class="token4">foo</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">test</span><span class="token3">(</span>stdClass $a<span class="token3">,</span> array $z<span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">bar</span> extends <span class="token4">foo</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">test</span><span class="token3">(</span>stdClass $b<span class="token3">,</span> array $c<span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//总结得出 php是弱类型语言所以重写父类方法只涉及对象类型和数组类型</span> ``` ```