gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

帶你吃透16個PHP魔術方法

什么是魔術方法?本篇文章帶大家了解一下16個PHP 開發者必知必會的魔術方法,希望對大家有所幫助!

帶你吃透16個PHP魔術方法

在PHP中,以雙下劃線(__)開始命名的方法被稱作PHP中的魔術方法,它們在PHP中充當很重要的角色。魔術方法包括:

方法名 描述
__construct() 類的構造函數
__destruct() 類的析構函數
__call($funName, $arguments) 當調用一個未定義或不可達方法時, __call() 方法將被調用。
__callStatic($funName, $arguments) 當調用一個未定義或不可達的靜態方法時, __callStatic() 方法將被調用。
__get($propertyName) 當獲取一個類的成員變量時, __get() 方法將被調用。
__set($property, $value) 當賦值一個類的成員變量時, __set() 方法將被調用。
__isset($content) 當調用 isset() 或 empty() 對一個未定義或不可達的成員賦值時, __isset() 方法將被調用。
__unset($content) 當調用 reset() 對一個未定義或不可達的成員更新時, __unset() 方法將被調用。
__sleep() 當執行序列化 serialize() 時,__sleep() 方法將首先被調用。
__wakeup() 當執行反序列化 deserialization() 時, __wakeup() 方法將首先被調用。
__toString() 當使用 echo 方法直接輸出顯示對象時,__toString() 方法首先被調用。
__invoke() 使用調用函數(function)訪問一個對象時, __invoke() 方法將首先被調用。
__set_state($an_array) 當調用 var_export() 方法時,__set_state() 方法將被調用。
__clone() 當對象被復制賦值時,__clone() 方法將被調用。
__autoload($className) 試圖載入一個未定義的類時調用。
__debugInfo() 輸出 debug 信息。

本文將使用一些實例展示 PHP 魔術方法的運用。

1.__construct()

當創建對象時,PHP 類的構造方法是第一個被調用的方法。每個類都有構造方法。若你沒在類中明確聲明定義它,將會有一個默認的無參類構造方法存在,雖然它不會在類中定義出現。

1) 構造方法的運用

類的構造方法通常用于執行一些初始化任務,諸如當創建對象時,為成員初始化賦值。

2) 類中構造方法的聲明格式

function __constrct([parameter list]){      方法具體實現 //通常為成員變量初始賦值。  }

注意: 在多數類中僅可以聲明一個構造方法。因為, PHP 不支持構造方法重載。

下面是個完整的例子:

<?php     class Person     {                                                                                  public $name;                    public $age;                    public $sex;                 /**          * 明確定義含參的構造方法          */                                                                                                public function __construct($name="", $sex="Male", $age=22)         {                  $this->name = $name;             $this->sex = $sex;             $this->age = $age;         }          /**          * say 方法定義          */         public function say()         {             echo "Name:" . $this->name . ",Sex:" . $this->sex . ",Age:" . $this->age;         }         }

無參創建 $Person1 對象。

$Person1 = new Person(); echo $Person1->say(); //顯示:Name:,Sex:Male,Age:22

使用一個參數 "Jams" 調用創建 $Person2 對象。

$Person2 = new Person("Jams"); echo $Person2->say(); // 顯示: Name: Jams, Sex: Male, Age: 22

使用3個參數調用創建 $Person3 對象。

$Person3 = new Person ("Jack", "Male", 25); echo $Person3->say(); // 顯示:Name: Jack, Sex: Male, Age: 25

__destruct()

析構函數與構造函數相反。

析構函數允許你在銷毀對象之前執行一些操作,例如關閉文件,清空結果集等等。

析構函數是 PHP 5 引入的新功能。

析構函數的聲明與構造函數類似,以兩個下劃線開頭,名稱固定為 __destruct()

析構函數的聲明

function __destruct() {     //method body }

析構函數不能帶參數。

析構函數的使用

析構函數在類中一般不常見。它是類的可選部分,通常用于在類銷毀之前完成一些清理任務。

這是使用析構函數的示例:

<?php class Person{           public $name;              public $age;              public $sex;               public function __construct($name="", $sex="Male", $age=22)     {            $this->name = $name;         $this->sex  = $sex;         $this->age  = $age;     }      /**      * say method      */     public function say()     {         echo "Name:".$this->name.",Sex:".$this->sex.",Age:".$this->age;     }         /**      * declare a destructor method      */     public function __destruct()     {             echo "Well, my name is ".$this->name;     } }  $Person = new Person("John"); unset($Person); //destroy the object of $Person created above

輸出結果

Well, my name is John

__call()

該方法接受兩個參數。第一個參數為未定義的方法名稱,第二個參數則為傳入方法的參數構成的數組

使用

function __call(string $function_name, array $arguments) {     // method body }

在程序中調用未定義方法時, __call() 方法將被調用。

示例

<?php class Person {                                  function say()     {            echo "Hello, world!<br>";     }           function __call($funName, $arguments)     {           echo "The function you called:" . $funName . "(parameter:" ;  // Print the method's name that is not existed.           print_r($arguments); // Print the parameter list of the method that is not existed.           echo ")does not exist!!<br>n";                        }                                          } $Person = new Person();            $Person->run("teacher"); // If the method which is not existed is called within the object, then the __call() method will be called automatically. $Person->eat("John", "apple");              $Person->say();

顯示結果

The function you called: run (parameter: Array([0] => teacher)) does not exist! The function you called: eat (parameter: Array([0] => John[1] => apple)) does not exist! Hello world!

4. __callStatic()

當在程序中調用未定義的靜態方法,__callStatic() 方法將會被自動調用。

__callStatic() 的用法類似于 __call() 。下面舉個例子:

<?php class Person {     function say()     {         echo "Hello, world!<br>";     }      public static function __callStatic($funName, $arguments)     {         echo "The static method you called:" . $funName . "(parameter:" ;  // 打印出未定義的方法名。         print_r($arguments); // 打印出未定義方法的參數列表。         echo ")does not exist!<br>n";     } } $Person = new Person(); $Person::run("teacher"); // 如果此項目內不存在的方法被調用了,那么 __callStatic() 方法將被自動調用。 $Person::eat("John", "apple"); $Person->say();

執行結果如下:

The static method you called: run (parameter: Array([0] => teacher)) does not exist! The static method you called: eat (parameter: Array([0] => John[1] => apple)) does not exist! Hello world!

__get()

當你嘗試在外部訪問對象的私有屬性時,應用程序將拋出異常并結束運行。我們可以使用 __get 方法解決該問題。該方法可以獲取從對象外部獲取私有屬性的值。舉例如下

<?php class Person {     private $name;     private $age;      function __construct($name="", $age=1)     {         $this->name = $name;         $this->age = $age;     }      public function __get($propertyName)     {            if ($propertyName == "age") {             if ($this->age > 30) {                 return $this->age - 10;             } else {                 return $this->$propertyName;             }         } else {             return $this->$propertyName;         }     } } $Person = new Person("John", 60);   // Instantiate the object with the Person class and assign initial values to the properties with the constructor. echo "Name:" . $Person->name . "<br>";   // When the private property is accessed, the __get() method will be called automatically,so we can get the property value indirectly. echo "Age:" . $Person->age . "<br>";    // The __get() method is called automatically,and it returns different values according to the object itself.

結果顯示如下

Name: John Age: 50

6. __set()

set($property,$value)方法用于設置類的私有屬性。分配了未定義的屬性后,將觸發set()方法,并且傳遞的參數是設置的屬性名稱和值。

下面是演示代碼:

<?php class Person {     private $name;     private $age;      public function __construct($name="",  $age=25)     {         $this->name = $name;         $this->age  = $age;     }      public function __set($property, $value) {         if ($property=="age")         {             if ($value > 150 || $value < 0) {                 return;             }         }         $this->$property = $value;     }      public function say(){         echo "My name is ".$this->name.",I'm ".$this->age." years old";     } }  $Person=new Person("John", 25); //請注意,類初始化并為“name”和“age”分配初始值。 $Person->name = "Lili";     // "name" 屬性值被成功修改。如果沒有__set()方法,程序將報錯。 $Person->age = 16; // "age"屬性修改成功。 $Person->age = 160; //160是無效值,因此修改失敗。 $Person->say();  //輸出:My name is Lili, I'm 16 years old。

代碼運行結果:

My name is Lili, I'm 16 years old

7. __isset()

在使用__isset()方法之前,讓我先解釋一下isset()方法的用法。isset()方法主要用于確定是否設置了此變量。

如果在對象外部使用isset()方法,則有兩種情況:

  1. 如果該參數是公共屬性,則可以使用isset()方法確定是否設置了該屬性。
  2. 如果參數是私有屬性,則isset()方法將不起作用。

那么對于私有屬性,有什么辦法知道它是否被設置了嗎?當然,只要在類中定義__isset()方法,就可以在類外部使用isset()方法來確定是否設置了私有屬性。

當在未定義或不可訪問的屬性上調用isset()或empty()時,將調用__isset()方法。下面是一個例子:

<?php class Person {     public $sex;     private $name;     private $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      /**      * @param $content      *      * @return bool      */     public function __isset($content) {         echo "The {$content} property is private,the __isset() method is called automatically.<br>";         echo  isset($this->$content);     } }  $person = new Person("John", 25); // Initially assigned. echo isset($person->sex),"<br>"; echo isset($person->name),"<br>"; echo isset($person->age),"<br>";

代碼運行結果如下:

1 The name property is private,the __isset() method is called automatically. 1 The age property is private,the __isset() method is called automatically. 1

8. __unset()

isset()方法類似,當在未定義或不可訪問的屬性上調用unset()方法時,將調用unset()方法。下面是一個例子:

<?php class Person {     public $sex;     private $name;     private $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      /**      * @param $content      *      * @return bool      */     public function __unset($content) {         echo "It is called automatically when we use the unset() method outside the class.<br>";         echo  isset($this->$content);     } }  $person = new Person("John", 25); // Initially assigned. unset($person->sex),"<br>"; unset($person->name),"<br>"; unset($person->age),"<br>";

代碼的運行結果如下:

It is called automatically when we use the unset() method outside the class. 1 It is called automatically when we use the unset() method outside the class. 1

9. __sleep()

serialize()方法將檢查類中是否有魔術方法__sleep()。如果存在,將首先調用該方法,然后執行序列化操作。

__sleep()方法通常用于指定保存數據之前需要序列化的屬性。如果有一些非常大的對象不需要全部保存,那么您會發現此功能非常有用。

有關詳細信息,請參考以下代碼:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      /**      * @return array      */     public function __sleep() {         echo "It is called when the serialize() method is called outside the class.<br>";         $this->name = base64_encode($this->name);         return array('name', 'age'); // It must return a value of which the elements are the name of the properties returned.     } }  $person = new Person('John'); // Initially assigned. echo serialize($person); echo '<br/>';

代碼運行結果如下:

It is called when the serialize() method is called outside the class. O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}

10. __wakeup()

sleep()方法相比,wakeup()方法通常用于反序列化操作,例如重建數據庫連接或執行其他初始化操作。

下面是相關實例:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      /**      * @return array      */     public function __sleep() {         echo "It is called when the serialize() method is called outside the class.<br>";         $this->name = base64_encode($this->name);         return array('name', 'age'); // It must return a value of which the elements are the name of the properties returned.     }      /**      * __wakeup      */     public function __wakeup() {         echo "It is called when the unserialize() method is called outside the class.<br>";         $this->name = 2;         $this->sex = 'Male';         // There is no need to return an array here.     } }  $person = new Person('John'); // Initially assigned. var_dump(serialize($person)); var_dump(unserialize(serialize($person)));

代碼運行結果如下:

It is called when the serialize() method is called outside the class. string(58) "O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}" It is called when the unserialize() method is called outside the class. object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> int(2) ["age"]=> int(25) }

11. __toString()

使用echo方法直接打印對象時,將調用__toString()方法。

注意:此方法必須返回一個字符串,否則將在E_RECOVERABLE_ERROR級別上引發致命錯誤。而且您也不能在__toString()方法中拋出異常。

下面是相關的實例:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      public function __toString()     {         return  'go go go';     } }  $person = new Person('John'); // Initially assigned. echo $person;

運行代碼結果如下:

go go go

那么,如果在類中未定義__toString()方法怎么辦?讓我們嘗試一下。

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }  }  $person = new Person('John'); // Initially assigned. echo $person;

運行代碼結果如下:

Catchable fatal error: Object of class Person could not be converted to string in D:phpStudyWWWtestindex.php on line 18

顯然,它在頁面上報告了一個致命錯誤,PHP語法不支持這樣的寫法。

12. __invoke()

當您嘗試以調用函數的方式調用對象時,__ invoke()方法將被自動調用。

注意:此功能僅在PHP 5.3.0及更高版本中有效。

下面是相關實例:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      public function __invoke() {         echo 'This is an object';     }  }  $person = new Person('John'); // Initially assigned. $person();

運行代碼結果如下:

This is an object

如果堅持使用對象作為方法(但未定義__invoke()方法),則將得到以下結果:

Fatal error: Function name must be a string in D:phpStudyWWWtestindex.php on line 18

13.__set_state()

從PHP 5.1.0開始,在調用var_export()導出類代碼時會自動調用__set_state()方法。

__set_state()方法的參數是一個包含所有屬性值的數組,其格式為array('property'=> value,…)

在以下示例中,我們沒有定義__set_state()方法:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }  }  $person = new Person('John'); // Initially assigned. var_export($person);

執行代碼結果如下:

Person::__set_state(array( 'sex' => 'Male', 'name' => 'John', 'age' => 25, ))

顯然,對象的屬性已打印。

現在讓我們看看定義__set_state()方法的另一種情況:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      public static function __set_state($an_array)     {         $a = new Person();         $a->name = $an_array['name'];         return $a;     }  }  $person = new Person('John'); // Initially assigned. $person->name = 'Jams'; var_export($person);

執行代碼結果如下:

Person::__set_state(array( 'sex' => 'Male', 'name' => 'Jams', 'age' => 25, ))

14. __clone()

在PHP中,我們可以使用clone關鍵字通過以下語法克隆對象:

$copy_of_object = clone $object;

但是,使用clone關鍵字只是一個淺拷貝,因為所有引用的屬性仍將指向原始變量。

如果在對象中定義了clone()方法,則將在復制生成的對象中調用clone()方法,該方法可用于修改屬性的值(如有必要)。

下面是相關的示例:

<?php class Person {     public $sex;     public $name;     public $age;      public function __construct($name="",  $age=25, $sex='Male')     {         $this->name = $name;         $this->age  = $age;         $this->sex  = $sex;     }      public function __clone()     {         echo __METHOD__."your are cloning the object.<br>";     }  }  $person = new Person('John'); // Initially assigned. $person2 = clone $person;  var_dump('persion1:'); var_dump($person); echo '<br>'; var_dump('persion2:'); var_dump($person2);

運行代碼結果如下:

Person::__clone your are cloning the object. string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) } string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }

15.__autoload()

__autoload()方法可以嘗試加載未定義的類。

過去,如果要在程序文件中創建100個對象,則必須使用include()或require()來包含100個類文件,或者必須在同一類文件中定義100個類。 例如以下:

/**  * file non_autoload.php  */  require_once('project/class/A.php'); require_once('project/class/B.php'); require_once('project/class/C.php'); . . .  if (ConditionA) {     $a = new A();     $b = new B();     $c = new C();     // … } else if (ConditionB) {     $a = newA();     $b = new B();     // … }

那么,如果我們使用__autoload()方法呢?

/**  * file autoload_demo.php  */ function  __autoload($className) {     $filePath = “project/class/{$className}.php”;     if (is_readable($filePath)) {         require($filePath);     } }  if (ConditionA) {     $a = new A();     $b = new B();     $c = new C();     // … } else if (ConditionB) {     $a = newA();     $b = new B();     // … }

當PHP引擎第一次使用類A時,如果未找到類A,則autoload方法將被自動調用,并且類名稱“ A”將作為參數傳遞。因此,我們在autoload()方法中需要做的是根據類名找到相應的類文件,然后將其包含在內。如果找不到該文件,則php引擎將拋出異常。

16. __debugInfo()

當執行 var_dump() 方法時,__debugInfo() 方法會被自動調用。如果 __debugInfo() 方法未被定義,那么 var_dump 方法或打印出這個對象的所有屬性。

舉例說明:

<?php class C {     private $prop;      public function __construct($val) {         $this->prop = $val;     }      /**      * @return array      */     public function __debugInfo() {         return [             'propSquared' => $this->prop ** 2,         ];     } }  var_dump(new C(42));

執行結果:

object(C)#1 (1) { ["propSquared"]=> int(1764) }

注意:__debugInfo() 方法應該在 PHP 5.6.0 及以上版本中使用。

總結

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲黄色av网址| 中文字幕综合在线观看| 日韩亚洲欧美视频| 在线观看日本www| 99九九精品视频| 熟妇熟女乱妇乱女网站| 日本一级淫片演员| 热久久精品免费视频| av无码精品一区二区三区| 久久精品国产精品亚洲色婷婷| 黄页免费在线观看视频| 国产一区二区三区乱码| 女人被男人躁得好爽免费视频| 穿情趣内衣被c到高潮视频| 男女爱爱视频网站| 亚洲国产成人精品无码区99| 久久久久久久午夜| 青青在线免费观看视频| 国产欧美精品一二三| 日韩人妻精品一区二区三区| 91动漫在线看| wwwwxxxx日韩| 日本丰满少妇黄大片在线观看| 日本一本中文字幕| 白嫩少妇丰满一区二区| 午夜免费福利视频在线观看| 麻豆传媒网站在线观看| 99999精品视频| 亚洲图片 自拍偷拍| 夜夜添无码一区二区三区| 一区二区在线播放视频| 成人毛片100部免费看| 国产裸体舞一区二区三区| 老司机久久精品| 国产午夜大地久久| 成年人视频观看| 久久久久久久久久久久久久久国产| 成年丰满熟妇午夜免费视频| 成人精品小视频| 欧美中文字幕在线观看视频| 欧美丰满熟妇xxxxx| 肉大捧一出免费观看网站在线播放| 99热自拍偷拍| 大桥未久一区二区| 日本免费观看网站| 欧美乱大交xxxxx潮喷l头像| 99九九99九九九99九他书对| 男人用嘴添女人下身免费视频| 成人亚洲免费视频| 久久久久人妻精品一区三寸| 久久久久久久久影视| 一起操在线视频| 欧美亚洲日本一区二区三区| 桥本有菜av在线| 亚洲人视频在线| 午夜肉伦伦影院| 欧美一级片免费播放| 99热手机在线| 久久婷婷五月综合色国产香蕉| 久久久天堂国产精品| 天天做天天爱天天高潮| 不卡中文字幕在线| 三日本三级少妇三级99| 加勒比av中文字幕| 拔插拔插华人永久免费| 91小视频在线播放| 日韩精品视频网址| 日本一级淫片演员| 台湾无码一区二区| 亚洲熟妇无码一区二区三区导航| 91黄色在线看| 国产第一页视频| 污视频免费在线观看网站| 在线观看国产福利| 国产成人三级视频| 免费看国产曰批40分钟| 黑鬼大战白妞高潮喷白浆| 天天视频天天爽| 日本一二三区在线| 999一区二区三区| 激情综合网婷婷| 免费在线观看污网站| 成年人视频大全| 国产乱子夫妻xx黑人xyx真爽| 91最新在线观看| 黑人巨茎大战欧美白妇 | 日韩最新中文字幕| 欧美图片激情小说| 美女网站色免费| 久久人妻无码一区二区| 欧美 日韩 国产一区| 国产毛片久久久久久| 欧美二区在线视频| 久久精品一卡二卡| 无码人妻h动漫| 成人黄色片免费| 中文字幕在线观看第三页| 黄色一级片国产| jizz大全欧美jizzcom| 日本熟妇人妻xxxx| 中文av一区二区三区| 妞干网在线观看视频| 日韩成人av免费| 午夜dv内射一区二区| 欧美中文字幕在线观看视频| 鲁一鲁一鲁一鲁一av| 熟女少妇在线视频播放| 日韩人妻精品一区二区三区| a在线观看免费视频| 青青草视频在线免费播放| 欧洲美女亚洲激情| 日韩精品无码一区二区三区免费| 看一级黄色录像| 嫩草视频免费在线观看| 人妻熟妇乱又伦精品视频| 国内精品国产三级国产99| 亚欧激情乱码久久久久久久久| 亚洲午夜精品久久久久久人妖| 妞干网这里只有精品| 成人免费xxxxx在线视频| 国产精品无码人妻一区二区在线| 中文字幕第一页亚洲| 亚洲免费av一区| 久久精品网站视频| 免费无码不卡视频在线观看| 国产成人在线小视频| 一区二区三区日韩视频| 91精品999| 久久久久久久高清| 亚洲视频第二页| www亚洲成人| 最新中文字幕免费视频| 午夜免费一区二区| 久久久久久久少妇| 免费大片在线观看| 亚洲人成无码www久久久| 久久久久免费精品| 欧美成人免费高清视频| 国产真实乱子伦| 天天插天天操天天射| 亚洲精品20p| 偷拍盗摄高潮叫床对白清晰| 午夜影院免费观看视频| 国产人妻互换一区二区| 黄色三级中文字幕| 国产老熟妇精品观看| 成人羞羞国产免费网站| 91人人澡人人爽人人精品| 高清av免费看| 天天干天天色天天爽| 国产自产在线视频| 99蜜桃臀久久久欧美精品网站| 黄色a级片免费| 亚洲18在线看污www麻豆| 日本福利视频导航| 国产一二三在线视频| 黑人糟蹋人妻hd中文字幕| 性欧美videossex精品| 国产乱码一区二区三区四区| 久久久久久久9| 成人在线观看黄| 一本之道在线视频| 日本a在线免费观看| 久久久久久久久久久久91| 色哟哟免费网站| 国产美女三级视频| www.成人黄色| 亚洲中文字幕无码中文字| 色噜噜狠狠一区二区| 国产一区二区三区小说| 国产成人黄色网址| 日韩亚洲欧美视频| 中文字幕天天干| 国产玉足脚交久久欧美| 97超碰成人在线| 国产99久久九九精品无码| а 天堂 在线| 日韩avxxx| 乱熟女高潮一区二区在线| 免费看黄色一级大片| 日本手机在线视频| 中文字幕一区久久| 中文字幕欧美人妻精品一区| 91免费国产精品| 搡的我好爽在线观看免费视频| 免费国产a级片| 人妻无码一区二区三区四区| 人人干人人干人人| 日韩小视频在线播放| 只有这里有精品| 亚洲三级在线观看视频| 国产精品沙发午睡系列| 屁屁影院ccyy国产第一页| 国产精品久久久久久久99| 另类小说色综合| 久草在在线视频| 情侣黄网站免费看| 国产精品一区二区免费在线观看| www国产无套内射com| 亚洲天堂一区二区在线观看|