# 面向對象的三大特點

屬性必須指定修飾符,方法默認是public
函數之間可以互相調用,但需要用this指向
## 封裝
姓名,性別公開,電話號碼,工資是隱私的。
訪問proteced,private的變量,使用下面**魔術方法**:
__set(), __get();
### 賦值操作:
`__set($name,$value);`
### 獲取屬性的值
`__get($name);`
~~~
//set get無法單獨效驗,雖然方便,但無法個性化
class A{
private $n1;
private $n2;
//set管理所有私有屬性
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//獲取所有屬性的值
public function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
public function add($n1){
$this->n1=$n1;
$this->n2=$n2;
}
}
$aa=new A();
$aa->n1="dddd";
echo $aa->n1;
~~~
#### 1.查看
~~~
<?
echo "<meta charset='utf-8'>";
class Child{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$age;
$this->salary=$salary;
}
//通過公開函數調用私有內容
function shows($username){
if($username=="111"){
echo $this->name."||".$this->age."||".$this->salary;
}else{
echo "無權限查看";
}
}
//通過公開函數修改私有屬性
public function setage($age){
if($age>100){
echo "你的年齡范圍不對";
}else{
$this->age=$age;
}
}
}
$cc=new Child("田偉","18","888");
$cc->name="dsfsd";
echo $cc->name;
echo $cc->setage(66);
echo $cc->shows("111");
~~~
#### 2.修改
$cc->name="田偉";
寫修改方法
## 繼承
繼承保證代碼的復用性

~~~
class stu{
public $name;
public $age;
public function showinfo(){
echo $this->name;
}
}
class pupil extends stu{
public function testing(){
echo "小學生考試";
}
}
class graduate extends stu{
public function testing(){
echo "大學生考試";
}
}
~~~
注意點:
1. 子類只能繼承父類的public,protected ,不能繼承private
2. 一個子類只能繼承一個父類,但可以通過繼承2次達到效果。
3. 子類默認不會自動繼承父類的構造方法。
4.如果要調用發父類的構造方法或其他方法,可以通過
父類名::__construct();
parent::_construct();

## 多態,重載 overload
一樣的函數名,但是參數個數不一樣,達到調用同一個函數名,但是可以區分不同的函數。
重載函數:__call(),官方并不推薦。
總結:
1.php5 默認情況下不直接支持方法重載
2.可以通過 __call()模擬方法重載效果
3.PHP5魔術常量
__LINE__
__FILE__
__FUNCTION__ 必須在函數里面
__CLASS__ 必須在類里面調用
__METHOD__
__DIR__
__NAMESPACE__
## 方法重寫、覆蓋 override
父類知道每個子類都有某個方法,但父類不能確定子類方法的具體如何寫,這個時候子類就可以重寫覆蓋這個方法。
注意:
**子類和父類的名稱,參數必須完全一樣**,參數名稱可以不一樣
覆蓋的時候,子類的修飾符訪問范圍不能低于父類的修飾符訪問權限。
子類覆蓋是在子類的區域內覆蓋,并不是修改了父類的程序。此時還是可以調用這個父類的方法
~~~
class A{
public $name;
function cry(){
echo "不知道怎么叫。。。";
}
}
class Dog extends A{
//覆蓋
function cry(){
echo "小狗旺旺叫。。";
parent::cry();
}
}
$dog1=new Dog();
$dog1->cry();
~~~