日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

[转载]用c写PHP的扩展接口(php5,c++)

發布時間:2023/12/9 php 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载]用c写PHP的扩展接口(php5,c++) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文[http://bugs.tutorbuddy.com/php5cpp/php5cpp/]

第1節. 開始之前

開始前,我要說明:這篇文章所描述的主要是在UNIX的PHP環境上的。

另外一點我要說明的是:文中所介紹的方法在PHP 4.3.x和PHP 5下都是可行的。盡管我們在開始的時候會基于PHP5來介紹,但是你會發現這些方法在PHP 4.3.x中也是可行的。

我在本文中有一些約定...

$PHP_HOME 是指你的PHP源代碼的位置,如:你解開的PHP源代碼包所放的位置。在我的系統中指的是:/home/jay/setup/php/php-x.x.x.

我們用來做例子的模塊叫做php5cpp.


第2節.安裝

在你用C++編寫PHP擴展前,你先要搭建一個基本的擴展模塊的架構。在UNIX下,你可以運行一個在 $PHP_HOME/ext 下叫做ext_skel 的shell腳本。先切換到 $PHP_HOME/ext 目錄和執行那個shell腳本,并用 --extname 參數為你的擴展模塊命名。

jay@monty ~ $ cd setup/php/php-5.x.x/ext

jay@month ext $ ./ext_skel --extname php5cpp

在Windows系統,目前PHP CVS代碼中,可以使用位于 $PHP_HOME/ext 的 ext_skel_win32.php 的PHP腳本是。也許它會成為PHP5的一部分及被PHP 4.x的分支包含。但這只是我大膽的猜想,我并不知道會不會實現...

這樣,在$PHP_HOME/ext/php5cpp下,我們已經有了一個基本的PHP擴展模塊架構。唯一的問題是,它是為C搭建的,而不是為C++。

第3節.修改config.m4

現在我們要修改那個擴展模塊的config.m4 文件以支持C++。

你不需要做太多的改動,要做的只是告訴編譯PHP的系統,你的模塊是使用C++的,而且需要連接C++標準庫。下邊是一個刪去自動生成的注釋后,php5cpp 擴展模塊的config.m4文件的例子:

PHP_ARG_ENABLE(php5cpp, for php5cpp support,

[ --enable-php5cpp Enable php5cpp support])



if test "$PHP_php5cpp" != "no" ; then

PHP_REQUIRE_CXX()

PHP_NEW_EXTENSION(php5cpp, php5cpp.cpp, $ext_shared)

fi

注意其中的PHP_REQUIRE_CXX(),和php5cpp.c 已經變成了 php5cpp.cpp 了。
第4節.編寫代碼

修改完config.m4 后,你可以編寫代碼了。記住把php5cpp.c 修改成C++文件的名字。根據前邊 config.m4的修改,在這里我們把它改成 php5cpp.cpp.

現在你可以開始編寫你的代碼了。但是你如果現在編譯這個擴展代碼的話,可能會生一個so,并且不會產生任何編譯錯誤,但是并不能在PHP中使用。如果你把它靜態編譯進PHP,則會產生連接錯誤。這是因為C和C++的變量空間的不一致引起的 (PHP是使用C來編寫,你的擴展使用C++來編寫) 。

修改的方法就是,你要告訴你的擴展模塊,將把一些PHP API函數當成C函數來對待(他們是用C來寫的),而不是當成C++。

你需要把一些代碼用 BEGIN/END_EXTERN_C()包起來。你的php5cpp.cpp 可能要寫成像下邊的樣子:

extern "C" {

#include "php.h"

#include "php_ini.h"

#include "ext/standard/info.h"

}

#ifdef COMPILE_DL_PHP5CPP

BEGIN_EXTERN_C()

ZEND_GET_MODULE(php5cpp)

END_EXTERN_C()

#endif

一般地,我們是用 BEGIN/END_EXTERN_C() 來包起頭文件的那些內容,如對 ZEND_GET_MODULE(php5cpp)那樣。但是在引用聲明 BEGIN/END_EXTERN_C() 的 zend.h文件前,可以通過使用extern "C" 來達到相同的作用。

在Windows系統,可以使用Visual C++編譯你的擴展模塊。這也需要在的擴展模塊的頭部加上類似的聲明:

#ifdef PHP_WIN32

#include

#include

#endif

這樣你可以使得你的代碼保持跨平臺的特性。

第5節.編譯擴展模塊

現在可以去編譯擴展模塊了。如果你想把它編譯成靜態模塊(把它做為PHP的一個部分編譯進PHP中去),去到PHP的根目錄$PHP_HOME,刪去 configure 文件和運行buildconf (譯:需要libtool的支持)。

然后用你平常用的參數運行 configure 并加上--enable-php5cpp 項。運行 make clean, make, make install ,并完成其它的一些必要操作,如:重新編譯Apache。

如果你想用動態鏈接庫的方式編譯擴展模塊,到你的模塊的目錄下,運行phpize 命令(假設你已經安裝了PEAR),它會為你的模塊創建一個 configure 腳本。然后運行configure, make 和 make install。如果你想讓你的模塊自動加載,你要修改php.ini 以加載正確的文件。如:加上類似的一行:extension=php5cpp.so 。

現在你的PHP擴展模塊已經編譯好了。試著運行一下在模塊目錄下自動生成的php5cpp.php ,看看是不是一切正常?:)

第6節.將C++類影射到PHP中

目錄

類MyClass

宏、函數及其它

封裝代碼

PHP 5的類支持很多新的特性。如:權限(protected, public, private),異常,interfaces,等等。在這個簡單的介紹中,我們只做最基本的事情:使PHP可以影射到C++的類。這樣你可以用PHP中使用你的類,之后的事情將會變得很簡單的。在看下面的介紹之前,你可以參考一下Sqlite, SimpleXML 及 cryptopp-php 模塊的代碼。

這里介紹一下。我們要用一個C++類做為例子,就叫做 MyClass吧。在PHP術語中,把它叫做一個resource(資源)。PHP常使用這類的東西,如數據庫的連接就是resource,它也可能是一個指向實際resource的struct(結構)。在C++中,class 實際上是struct的一個近義詞(struct默認為public,classe默認為private --僅這個區別而已)。

在結構化的接口中,我們會用類似以下的PHP代碼來使用resources:

$m = myclass_new();

myclass_set_string($m, 'hello world!');

var_dump(myclass_get_string($m));

?>

在面向對象式的接口中,一樣可以使用PHP resources,不過已經被封裝在一個PHP對象中了,如:

$m = new MyClass;

$m->setString('hello world!');

var_dump($m->getString());

?>

我們不需要關心被封裝的實際的代碼做了些什么。當我們有一個叫MyClass的C++類。我們可以把這個C++類當成resources并把C++類里的方法封裝成PHP的函數。然后我們也可以把它封裝成一個PHP的對象,使得可以像一般的C++那樣使用。

在看本文時,記住我們的目的就是:把C++類封裝成PHP可以使用的結構化的函數或對象化的類。也許在一開始有些東西會令你迷惑,但讀下去后就會慢慢明白的了。中間會有很多的宏定義,但當你看明白后,會覺得所有東西都很清淅很容易了。
1 類MyClass

首先我們需要一個類。下邊是一個只有一個私有屬性和幾個公有方法的簡單的類。

以下是這個類的聲明頭文件 myclass.h:

#ifndef __MYCLASS_H__

#define __MYCLASS_H__



#include



using namespace std;



class MyClass {

private:

string itsString;



public:

MyClass(string s = "default");

~MyClass();



string getString() const;

bool setString(const string s);

};



#endif

下邊是定義代碼myclass.cpp:

#include "myclass.h"



MyClass::MyClass(string s)

{

itsString = s;

}



MyClass::~MyClass()

{

}



string MyClass::getString() const

{

return itsString;

}



bool MyClass::setString(const string s)

{

itsString = s;

return true;

}

這只是一個做為例子的類。

然后我們要讓構建系統知道和可以編譯這些文件。把config.m4文件做以下修改:

PHP_NEW_EXTENSION(php5cpp, php5cpp.cpp, $ext_shared)



becomes...



PHP_NEW_EXTENSION(php5cpp, php5cpp.cpp myclass.cpp, $ext_shared)

在php5cpp.cpp 文件中增加#include “myclass.h” :

extern "C" {

#include "php.h"

#include "php_ini.h"

#include "ext/standard/info.h"

}



#include "php_php5cpp.h"

#include "myclass.h"

不要把include php_php5cpp.h 和 myclass.h 的語句放在 extern "C" 中,否則會出現錯誤。
2 宏、函數及其它

為了讓這個模塊可以同時在PHP 4和PHP 5使用,我們需要使用一些宏去聲明是依賴于PHP 4或是PHP 5的。因為PHP 4和PHP 5的執行文件是不兼容的,所以你需要為這兩個PHP的版本分別編譯不同的版本。

通常我會把這些宏的聲明放在一個單獨的文件中。在這個例子里,就放在objects.h 中吧。

objects.h 中要寫一些PHP 5需要的函數,如:

#ifndef __PHP5CPP_OBJECTS_H__

#define __PHP5CPP_OBJECTS_H__



#if PHP_MAJOR_VERSION == 5



zend_class_entry *php5cpp_ce_myclass;

static zend_object_handlers php5cpp_object_handlers_myclass;



function_entry php5cpp_myclass_methods[] = {

ZEND_ME_MAPPING(MyClass, myclass_new, NULL)

ZEND_ME_MAPPING(setString, myclass_set_string, NULL)

ZEND_ME_MAPPING(getString, myclass_get_string, NULL)

{NULL, NULL, NULL}

};



typedef enum {

is_myclass

} php5cpp_obj_type;



struct php5cpp_obj {

zend_object std;

int rsrc_id;

php5cpp_obj_type type;

union {

MyClass *myclass;

} u;

};

你可以發現,為了保持一致,每個聲明都加上了php5cpp_ 前綴。這是習慣上的一種約定。

另外,#if PHP_MAJOR_VERSION == 5表明在下邊的那些宏、函數等都只是在PHP 5下才生效,當我們在PHP 4下編譯時它們會被預處理忽略掉。

php5cpp_ce_myclass 是類 MyClass 的入口。 php5cpp_object_handlers_myclass 是類的內部處理handler(句柄)。

php5cpp_myclass_methods[] 把MyClass中的函數影射成可在PHP使用的標準函數。這樣我們在PHP中就可以使用 myclass_new, myclass_get_string 等來執行這些函數。你會發現這里并沒有定義myclass_destroy函數,因為在你對一個類實例使用unset() 時,系統會自動調用它的釋構函數的了。

在結構php5cpp_obj中的枚舉變量 php5cpp_obj_type 聲明了對象的類型。如果你想在擴展中再加入一個類,如: AnotherClass,你需要再增加一項,如: is_anotherclass。

php5cpp_obj 結構中聲明了在PHP中使用的一些基本信息,包括:

一個resource ID:rsrc_id ,它指向PHP內部的一個記錄著C++對象的track的resource(資源)。實際上,我們的類在PHP中的操作是更像是一個PHP resource,它有自己的垃圾回收和引用計數等機制。

一個zend_object 來聲明我們的PHP類,使得它可以像PHP的類那樣。當使用這個PHP類時,實際上就會調用我們的C++類去處理了。(需要記住的是:使用時需要像使用其它PHP類那樣動態的創建它。(譯:使用new))

type 聲明現在處理的對象。在這里,它只有一個:is_myclass。但正如我前邊說過,你可以再增加其它的類。

聯合類型變量u 保存了指向C++對象實例的指針。如果你在這個擴展中還有其它class,那還需要在這再增加其它的指針,如:AnotherClass *anotherclass。

static void php5cpp_object_free_storage(zend_object *object TSRMLS_DC)

{

php5cpp_obj *obj = (php5cpp_obj *) object;



zend_hash_destroy(obj->std.properties);

FREE_HASHTABLE(obj->std.properties);



if (obj->u.myclass) {

zend_list_delete(obj->rsrc_id);

}



efree(obj);

}

static void php5cpp_object_new(zend_class_entry *class_type, zend_object_handlers *handlers, zend_object_value *retval TSRMLS_DC)
{

zval *tmp;

php5cpp_obj *obj = (php5cpp_obj *) emalloc(sizeof(php5cpp_obj));

memset(obj, 0, sizeof(php5cpp_obj));

obj->std.ce = class_type;
ALLOC_HASHTABLE(obj->std.properties);
zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
zend_hash_copy(obj->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
retval->handle = zend_objects_store_put(obj, NULL, php5cpp_object_free_storage, NULL TSRMLS_CC);

retval->handlers = handlers;

}

php5cpp_object_free_storage() 可以看成了對象是 php5cpp_obj 的釋構函數,因為它要做的就是把MyClass的對象釋放掉

php5cpp_object_new() 基本上算是一個構造函數,它負責分配內存空間,分配zend_object結構,及初始化handler(句柄)等等。它負責為擴展中所有的類的構造,不管是對象MyClass 還是 AnotherClass。

php5cpp_object_new_myclass() 通過調用 php5cpp_object_new() 來創建一個PHP MyClsss的實例。如果在擴展中有幾個類的話,你要為每個類寫一個類似php5cpp_object_new_*()函數。

// Register the class entry..
#define PHP5CPP_REGISTER_CLASS(name, obj_name) \
{ \

zend_class_entry ce; \

INIT_CLASS_ENTRY(ce, obj_name, php5cpp_ ## name ##_methods); \

ce.create_object = php5cpp_object_new_ ## name; \

php5cpp_ce_ ## name = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC); \

memcpy(&php5cpp_object_handlers_ ## name, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \

php5cpp_object_handlers_ ## name.clone_obj = NULL; \

php5cpp_ce_ ## name->ce_flags |= ZEND_ACC_FINAL_CLASS; \

}

// Register resources. If we're using an object, put it into the object store.

#define PHP5CPP_REGISTER_RESOURCE(obj_type, return_value, res, le) \
{ \

int rsrc_id = ZEND_REGISTER_RESOURCE(object ? NULL : return_value, res, le); \

if (object) { \
php5cpp_obj *obj = (php5cpp_obj *) zend_object_store_get_object(object TSRMLS_CC); \

obj->u.obj_type= res; \

obj->rsrc_id = rsrc_id; \

obj->type = is_ ## obj_type; \

} \

}

#define PHP5CPP_REGISTER_MYCLASS_RESOURCE(return_value, res, le) \

PHP5CPP_REGISTER_RESOURCE(myclass, return_value, res, le)

接著我們要在php5cpp.cpp中加上以上的宏。雖然看起來很相似,但不要把它們弄亂,實際上PHP5CPP_REGISTER_CLASS() 和PHP5CPP_REGISTER_RESOURCE()的處理是不一樣的。

PHP5CPP_REGISTER_CLASS() 登記一個類的實際處理的程序。在后邊介紹模塊初始化函數(PHP_MINIT_FUNCTION())時還會遇到它。

PHP5CPP_REGISTER_RESOURCE() 負責在登記一個resource時取得resource得ID。其實resource就是我們的C++對象的一個實例。當我們處理一個對象時,它會創建一個PHP對象,把實際的對象保存在PHP的對象貯存器中,然后把resource ID記錄在PHP對象中。

PHP5CPP_REGISTER_MYCLASS_RESOURCE() 只是為了使用 PHP5CPP_REGISTER_RESOURCE()時可以方便一些。
// These are for parsing parameters and getting the actual object from the store.
#define PHP5CPP_GET_THIS() \
zval* object = getThis();
#define PHP5CPP_SET_OBJ(type) \
php5cpp_obj *obj = (php5cpp_obj *) zend_object_store_get_object(object TSRMLS_CC); \
type ## _instance = obj->u.type;
#define PHP5CPP_OBJ_PARAMS(type, params) \
PHP5CPP_GET_THIS(); \
if (object) { \
if (params == FAILURE) { \
RETURN_FALSE; \
} \
PHP5CPP_SET_OBJ(type) \
} \
else
#define PHP5CPP_OBJ_NO_PARAMS(type) \
PHP5CPP_GET_THIS(); \
if (object) { \
if (ZEND_NUM_ARGS() != 0) { \
php_error(E_WARNING, "didn't expect any arguments in %s()", get_active_function_name(TSRMLS_C)); \
} \

PHP5CPP_SET_OBJ(type) \

} \

else



#define PHP5CPP_MYCLASS_OBJ_PARAMS(params) PHP5CPP_OBJ_PARAMS(myclass, params)

#define PHP5CPP_MYCLASS_OBJ_NO_PARAMS() PHP5CPP_OBJ_NO_PARAMS(myclass)



PHP5CPP_GET_THIS() 會返回當前使用對象的指針。如果當前使用的是一個結構,那么getThis() 會返回NULL;如果使用的是一個對象,getThis() 返回一個指向當前PHP對象的指針。

PHP5CPP_SET_OBJ() 會從對象貯存器中取得PHP對象實際使用的C++對象實例,然后可以用來做其它處理。在使用PHP函數/方法時,對象會貯存在類似"type ## _instance" 的類型里,如:在我們的例子中是myclass_instance,即MyClass*類型。

PHP5CPP_*_OBJ_PARAMS() 和 PHP5CPP_*_NO_OBJ_PARAMS() 會在調用我們的函數/方法時被使用,它們會處理從PHP方傳進來的參數。在封裝函數和聲明中,可以通過zend_parse_parameters() 去分析這些參數。

你可以注意到,宏PHP5CPP_*_PARAMS() 是以 else結尾的。這樣的話,當所處理的不是一個對象時,它會試著用結構化方式去處理。這些宏都可以在下邊找到。

為PHP 5寫的類處理的部分已經寫完了,下邊的部分是為PHP 4寫的很簡單易懂的處理。如果我們用的是PHP 4,上邊的那部分代碼在預處理時會被乎略掉,而只處理下邊的這些代碼。如果我們用的是PHP 5則反之。

#else // End of PHP5-specific macros

// This stuff is for PHP 4. They're empty on purpose, obviously.

#define PHP5CPP_GET_THIS()

#define PHP5CPP_MYCLASS_OBJ_PARAMS(params)

#define PHP5CPP_MYCLASS_OBJ_NO_PARAMS()

#define PHP5CPP_REGISTER_CLASS(name, obj_name)

#define PHP5CPP_REGISTER_MYCLASS_RESOURCE(return_value, res, le) \

ZEND_REGISTER_RESOURCE(return_value, res, le);

#endif // End of PHP4-specific macros

非常的簡單,除了PHP5CPP_REGISTER_MYCLASS_RESOURCE()外其它的宏都是空的。 PHP5CPP_REGISTER_MYCLASS_RESOURCE()仍會注冊一個resource,但不會為對象做任何的檢查。好了,完成這些后,就使得代碼在PHP 4和PHP 5中都可以編譯通過了。

下邊的一些宏在PHP 4和PHP 5中都是一樣的,它們是處理結構和非面向對象代碼的。

// These are for both PHP 4 and 5

#define PHP5CPP_MYCLASS_RSRC_PARAMS(params) \

if (params == FAILURE) { \

RETURN_FALSE; \

} \

else { \

ZEND_FETCH_RESOURCE(myclass_instance, MyClass*, &resource, -1, "myclass", le_myclass); \

}

#define PHP5CPP_MYCLASS_RSRC_NO_PARAMS() \

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &resource) == FAILURE) { \

RETURN_FALSE; \

} \

else { \

ZEND_FETCH_RESOURCE(myclass_instance, MyClass*, &resource, -1, "myclass", le_myclass); \

}

static ZEND_RSRC_DTOR_FUNC(destroy_myclass)
{
if (rsrc->ptr) {

delete (MyClass*) rsrc->ptr;

rsrc->ptr = NULL;

}

}

#endif

它們同樣是很簡單的:先試著分析PHP界面傳進來的參數,和取得要處理的resource。

destroy_myclass 負責資源回收。當觸發垃圾回收機制,或destroy 對象/ resource 時,它會把在創建C++對象實例時分配的內存清理/釋放掉。

在php5cpp.cpp里我們會這樣使用這些宏:

PHP5CPP_MYCLASS_OBJ_PARAMS(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s, &len))

PHP5CPP_MYCLASS_RSRC_PARAMS(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &s, &len))

在PHP 5中,經過預處理后會變成這樣:

zval* object = getThis();

if (object) {

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s, &len) == FAILURE) {

RETURN_FALSE;

}

php5cpp_obj *obj = (php5cpp_obj *) zend_object_store_get_object(object TSRMLS_CC);

myclass_instance = obj->u.myclass;

}

else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &s, &len) == FAILURE) {

RETURN_FALSE;

}

else {

ZEND_FETCH_RESOURCE(myclass_instance, MyClass*, &resource, -1, "myclass", le_myclass); \

}

可以看到,在面向對象模式下,它會試著去取得對象,分析參數和取得實際的MyClass對象。如果在非面向對象的模式下,這段代碼會試著用結構的方式去分析參數,取得resource等等。

在PHP 4中,經過預處理后會變成了下邊這樣:

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &s, &len) == FAILURE) {

RETURN_FALSE;

}

else {

ZEND_FETCH_RESOURCE(myclass_instance, MyClass*, &resource, -1, "myclass", le_myclass); \

}

在這里(PHP 4中),面向對象的代碼會完全給忽略掉,只留下結構化程序的代碼。

為了上邊我們做的有意義,現在我們要做一個最簡單的部分,寫我們的封裝代碼,和使得在PHP中可以使用我們的class。
3 封裝代碼

我們要在php_php5cpp.h中加入一些封裝函數和方法的定義:

PHP_FUNCTION(myclass_new);

PHP_FUNCTION(myclass_destroy);

PHP_FUNCTION(myclass_set_string);

PHP_FUNCTION(myclass_get_string);

簡單吧。好,那我們在php5cpp.cpp中寫入封裝函數的執行代碼:

PHP_FUNCTION(myclass_new)

{

MyClass *myclass_instance;

char* s;

int len = 0;

PHP5CPP_GET_THIS();
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &s, &len) == FAILURE) {
RETURN_FALSE;
}
if (len) {

myclass_instance = new MyClass(string(s, len));

}

else {

myclass_instance = new MyClass;

}



if (myclass_instance != NULL) {

PHP5CPP_REGISTER_MYCLASS_RESOURCE(return_value, myclass_instance, le_myclass);

}

}



PHP_FUNCTION(myclass_destroy)

{

zval *resource;



if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &resource) == FAILURE) {

RETURN_FALSE;

}



zend_list_delete(Z_RESVAL_P(resource));

}

PHP_FUNCTION(myclass_set_string)

{

zval *resource;

MyClass *myclass_instance;

int len = -1;

char *s;

PHP5CPP_MYCLASS_OBJ_PARAMS(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s, &len))

PHP5CPP_MYCLASS_RSRC_PARAMS(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &s, &len))



if (myclass_instance == NULL) {

php_error(E_WARNING, "can't set string on null resource in %s()", get_active_function_name(TSRMLS_C));

RETURN_FALSE;

}

else {

myclass_instance->setString(string(s, len));

RETURN_TRUE;

}

}



PHP_FUNCTION(myclass_get_string)

{

zval *resource;

MyClass *myclass_instance = NULL;

string retval;

PHP5CPP_MYCLASS_OBJ_NO_PARAMS()

PHP5CPP_MYCLASS_RSRC_NO_PARAMS()



if (myclass_instance == NULL) {

php_error(E_WARNING, "can't get string from null resource in %s()", get_active_function_name(TSRMLS_C));

RETURN_FALSE;

}

else {

retval = myclass_instance->getString();

RETVAL_STRINGL((char*) retval.data(), retval.length(), 1);

}

}

這里沒什么太難的地方,所以我不想每個函數都解釋一次?,F在就只簡單看一下myclass_new()和myclass_set_string()做為例子。

在myclass_new()中,首先嘗試取得一個對象。再次說明,只在面向對象方式下才會生效,在PHP 4下會被預處理所忽略掉。

因為C++類的構造函數有默認的參數,所以我們要看看PHP是否有傳一個string類型的參數過來。分析完傳進來的參數后,就為分配 myclass_instance內存空間,然后用PHP5CPP_REGISTER_MYCLASS_RESOURCE把得到的resource貯存起來。在PHP 5的OO模式下,PHP5CPP_REGISTER_MYCLASS_RESOURC會把resource當成對象貯存,在PHP 4的結構化模塊下只會簡單的創建一個resource。

接著說myclass_set_string()...

首先,先定義一個zval結構去處理在PHP用結構化接口傳進來的參數。myclass_instance會被用來指向實際的C++對象。len和*s用來保存從PHP方傳來的字串和字串的長度。

在PHP 4下,PHP5CPP_MYCLASS_OBJ_PARAMS()會被預處理忽略。在PHP 5它會嘗試取得對象,如果獲取對象失敗,否會返回使用結構化接口的步驟。

在取得myclass_instance后,可以像平時使用類那樣使用C++ MyClass類。先調用MyClass的setString()方法。然后把得到的C++標準string類對象轉成類似C方式的char指針,并傳回給PHP方。

最后,要讓PHP知道這個新class,很簡單,在PHP_MINIT_FUNCTION中加入:

PHP5CPP_REGISTER_CLASS(myclass, "MyClass");



le_myclass = zend_register_list_destructors_ex(destroy_myclass, NULL, "myclass", module_number);

好了,到這里代碼已經寫完了。:P

第7節.然后...

然后,你可以按自己需要的方式編譯擴展模塊。你也許需要增加一些另外的代碼,像using namespace std 等。這個介紹的下邊幾頁會包含一個完整的可運行例子。這些代碼我已經在gentoo系統上測試過了,包括目前(2004-03-19)在CVS上是新的 PHP 5和PHP_4_3的環境。(譯:本譯文只提供了可查看代碼的鏈接,沒有包括這些代碼)

第8節.例子源代碼

譯文中沒有包括完整在例子源代碼,你通過下邊的鏈接去查看:

http://bugs.tutorbuddy.com/php5cpp/php5cpp/example_code.html


第9節.授權許可

本文在GNU Free Documentation License下授權傳播。以下是許可License的內容鏈接...

http://bugs.tutorbuddy.com/php5cpp/php5cpp/license.html

轉載于:https://www.cnblogs.com/wudan7/p/4185049.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[转载]用c写PHP的扩展接口(php5,c++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产韩国精品一区二区三区 | 亚洲mv大片欧洲mv大片免费 | 黄色影院在线免费观看 | 亚州精品一二三区 | 国产精品一区一区三区 | 天天干夜夜擦 | 激情久久一区二区三区 | 久久国产露脸精品国产 | 精品高清视频 | 黄色av播放 | 日韩影视在线观看 | 99视频在线 | 久久a国产 | 视频在线亚洲 | 婷婷中文在线 | 激情五月婷婷综合网 | 91视频首页| 久久老司机精品视频 | 国产免费不卡 | 久久国产精品久久精品 | 最新国产精品亚洲 | 久在线观看 | 欧美另类亚洲 | www.久草视频 | 精品一区二区免费视频 | 免费a现在观看 | 99视频偷窥在线精品国自产拍 | 久操视频在线免费看 | 成人精品影视 | 欧美一区中文字幕 | 中文字幕日韩伦理 | 欧美日韩不卡在线 | 国产专区视频在线观看 | a久久久久 | 天天爽人人爽夜夜爽 | 久久久亚洲网站 | 特级黄色电影 | 成人一区影院 | 国产成人区 | 黄色一级大片在线免费看国产一 | 狠狠色噜噜狠狠狠狠2021天天 | 国产精品欧美日韩在线观看 | 国产一级高清 | 麻豆视频观看 | 日韩色一区二区三区 | 欧美激情综合五月色丁香小说 | 免费在线观看av网站 | 成人中文字幕在线 | 91精品国产一区二区三区 | 亚洲综合在线发布 | 国产 日韩 在线 亚洲 字幕 中文 | 精品免费久久久久久 | 在线观看91精品视频 | 天天操天天色天天 | 在线免费av播放 | 国产一级在线 | 精品国产乱码久久久久久1区2匹 | 日韩精品视频在线免费观看 | 欧美精品在线观看免费 | 97成人精品| 中国一区二区视频 | 美女国内精品自产拍在线播放 | 欧美日韩xxx | 国产福利在线不卡 | 日韩欧美一区二区三区在线 | 日韩久久精品一区二区 | 不卡中文字幕在线 | 中文字幕视频免费观看 | 国产精品久久久久久五月尺 | 香蕉在线视频播放网站 | 国产精品久久久久永久免费看 | 美女性爽视频国产免费app | 国产精品美女视频网站 | 99自拍视频在线观看 | 精品综合久久久 | 国产黄色网 | 日韩色高清| 免费观看久久 | 国产美女免费看 | 在线草| 国产午夜精品在线 | 欧美午夜精品久久久久久孕妇 | 免费色av | 亚洲区另类春色综合小说 | 中文字幕亚洲欧美 | 久久免费av电影 | 久久久久久久久久久网 | 色婷婷激情电影 | 国产精品免费在线 | 天天干天天想 | 国产精品99免费看 | 色偷偷88欧美精品久久久 | 亚洲国产精品成人va在线观看 | 欧美极品xxx | 亚洲精品88欧美一区二区 | 国产特级毛片aaaaaa高清 | 美女啪啪图片 | 日本黄色片一区二区 | 午夜在线观看影院 | 在线观看日韩中文字幕 | 91成人免费在线视频 | 亚洲蜜桃在线 | 亚洲精品五月 | 国产精品一区二区麻豆 | 国内精品久久久久影院男同志 | 美女视频黄频 | 日韩精品中字 | 激情五月***国产精品 | 午夜在线观看 | 精品国产人成亚洲区 | 在线观看资源 | 美女久久| 91超碰在线播放 | 欧美a级在线 | 激情综合久久 | 美国av大片| 亚洲综合在线发布 | 天天操夜夜做 | 在线免费观看不卡av | 黄色aa久久| 国产精品久久精品 | 国产精品免费久久 | 午夜色性片 | 日韩激情一二三区 | 国产精品video爽爽爽爽 | 免费看的黄色片 | 人人玩人人添人人 | 九九热在线精品 | 97福利社 | 久久黄网站 | 婷婷久久综合网 | 黄色免费电影网站 | 日日爽视频 | 中文字幕国产亚洲 | 国产精品久久久久久久久大全 | 在线天堂亚洲 | 久久久999免费视频 日韩网站在线 | 日日夜夜免费精品 | 欧美精品一区二区在线播放 | 久久成人在线视频 | 国产一级片免费观看 | 日韩午夜网站 | 欧美一区二区三区免费看 | 亚在线播放中文视频 | 久久公开免费视频 | 91黄色在线视频 | www.888av| 亚洲成人免费在线观看 | av大片网站 | 综合婷婷久久 | 欧美一级日韩免费不卡 | 欧美91av| 狠狠ri| 中文字幕第一页av | 亚洲午夜小视频 | 成人禁用看黄a在线 | 人人干97 | 久久尤物电影视频在线观看 | 日本免费一二三区 | 99视频在线免费看 | 国产欧美精品一区二区三区四区 | 久草男人天堂 | 国产一级视频在线观看 | 国产理论影院 | 久草视频免费在线播放 | 99视频在线观看一区三区 | 天天干人人干 | 蜜臀av网址 | 在线观看精品国产 | 91大神精品视频在线观看 | 免费看一级片 | 天天躁日日躁狠狠 | 91精品国产欧美一区二区 | 国产高清在线不卡 | 日韩激情av在线 | 精品视频在线免费观看 | 亚洲理论视频 | 97色狠狠| 国产精品成人av电影 | 三级视频日韩 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 欧美一区二视频在线免费观看 | 亚洲 欧美 日韩 综合 | 久久理伦片 | 国产成人在线网站 | 丁香电影小说免费视频观看 | 国产精品自拍在线 | 久久免费成人网 | 三级av小说| 天天爽天天做 | 国产精品2020 | 91看毛片 | 欧美精品中文 | 亚洲91在线 | 日本成人中文字幕在线观看 | 亚洲婷婷综合色高清在线 | 精品免费观看视频 | 91精品小视频 | 五月天婷婷在线观看视频 | 97精品国产91久久久久久 | 嫩草av在线 | 黄色毛片网站在线观看 | 亚洲精品五月天 | 91精品老司机久久一区啪 | 日韩综合一区二区 | 精品国产乱码久久久久久1区二区 | 国产精品高清在线观看 | 天天操夜夜摸 | 国产裸体视频网站 | 中日韩欧美精彩视频 | 久久久久这里只有精品 | 午夜精品麻豆 | 日韩视频一区二区在线 | 91黄视频在线 | 在线免费黄色av | 国产在线精品福利 | 欧美先锋影音 | 2000xxx影视 | 成人网在线免费视频 | 国产热re99久久6国产精品 | 婷婷色视频| 激情伊人五月天久久综合 | 国产 在线 日韩 | 亚洲成人av在线电影 | 免费视频一二三 | 免费裸体视频网 | 97超在线 | 久久精品黄色 | 国产一区二区久久久久 | 四虎免费在线观看视频 | 中文资源在线官网 | 日韩高清无线码2023 | 免费中文字幕视频 | 天天干天天玩天天操 | 日韩精品电影在线播放 | 亚洲精品视频www | 国产18精品乱码免费看 | 国产精品久久久久久久久久免费看 | 精品久久久久_ | 久久成人亚洲欧美电影 | 国产成人一区二区在线观看 | 美女天天操 | 胖bbbb搡bbbb擦bbbb | 日本三级久久 | 久久99久久99精品免观看软件 | 国产一级二级在线 | 色一级片 | 91视频在线观看下载 | 97超碰成人在线 | 夜色成人av | 日韩3区 | 久久艹国产 | 欧美影片| 欧美三级高清 | 五月婷婷丁香六月 | 色综合国产 | 亚洲精品国产欧美在线观看 | www.99av| 欧美一级小视频 | av三级在线免费观看 | 久久网站免费 | 国产精品大全 | 中文字幕av专区 | 天天想夜夜操 | 精品少妇一区二区三区在线 | 日韩高清一二三区 | 日韩av午夜 | 欧美久久久一区二区三区 | 中文免费观看 | 黄色精品久久久 | 日本女人的性生活视频 | 国产原创在线 | 国产特级毛片aaaaaa毛片 | 中文字幕资源在线 | 成人99免费视频 | 中文乱码视频在线观看 | 久久福利剧场 | 91免费观看 | 黄色成人毛片 | 亚洲一级免费观看 | 在线之家免费在线观看电影 | 伊人激情网 | 天天色天天干天天色 | 91一区二区三区久久久久国产乱 | a级免费观看 | 99精品免费 | 丁香激情视频 | 欧美日韩午夜在线 | 久久午夜国产精品 | 久久免费a| 色多多视频在线观看 | www.色爱 | 亚洲成av人影院 | 精品黄色在线观看 | 久久伊人热 | 午夜精品一区二区三区视频免费看 | 黄色视屏av | 免费看成年人 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久视频这里只有精品 | 九九免费观看视频 | 日韩中文字幕免费视频 | 中文字幕a在线 | www国产在线 | 日本精品久久久久中文字幕5 | 超碰在线官网 | 亚洲精品欧美成人 | 国产成人精品一二三区 | 欧美精品亚洲精品日韩精品 | 在线观看第一页 | 五月婷婷久草 | 九九热re| 麻豆系列在线观看 | 欧美性生活免费看 | 国产一区二区三区高清播放 | 成人黄色中文字幕 | 亚洲视频免费在线看 | 日日夜夜天天久久 | 国产精品成人自产拍在线观看 | 色欲综合视频天天天 | 四虎国产精品免费观看视频优播 | 99久久国产免费看 | 亚洲免费成人 | 亚洲国产中文字幕 | 91色综合| 一区二区视频在线观看免费 | 就要色综合 | 色综合久久99 | 噜噜色官网 | 国产中出在线观看 | 伊甸园av在线 | 国产精品一区在线观看 | 波多野结衣精品视频 | 碰碰影院 | 人人舔人人爱 | 欧美激情va永久在线播放 | 欧美日韩成人一区 | 激情五月视频 | 国产流白浆高潮在线观看 | 久久久精华网 | 日批视频在线 | 亚洲精品国产精品久久99热 | 99精品免费在线观看 | 高清av免费看 | 久久精品国产第一区二区三区 | 在线观看免费av网 | 久久香蕉一区 | 久久九九久久 | 99麻豆视频 | 国产黄色免费电影 | 日韩在线免费不卡 | 黄污网站在线 | 国产精品久久久久久久久免费看 | av中文字幕亚洲 | 婷婷丁香七月 | 国产视频中文字幕在线观看 | 国产日产精品一区二区三区四区的观看方式 | 麻豆果冻剧传媒在线播放 | 一区二区视频网站 | 色综合天天在线 | 不卡av电影在线 | 人人澡人人爽欧一区 | 精品国产91亚洲一区二区三区www | 中文字幕在线观看免费观看 | 免费网站观看www在线观看 | 久久狠狠亚洲综合 | 亚洲精品欧美成人 | 久久9999久久| 国产精品久久久久久久毛片 | 亚洲精品免费在线视频 | 天天干夜夜擦 | 又黄又爽又无遮挡的视频 | av在线播放中文字幕 | 精品久久在线 | 日本在线观看中文字幕无线观看 | 日韩美女免费线视频 | 精品一区二区三区香蕉蜜桃 | 日韩av电影免费在线观看 | 欧美日韩一区二区视频在线观看 | 国产精品手机在线观看 | 一级片免费视频 | 亚洲在线视频观看 | 国产午夜av | 日本精品免费看 | 午夜精品久久久久久久99热影院 | 日韩一级电影在线 | 成人精品久久久 | 国产很黄很色的视频 | 日韩精品视频在线免费观看 | 97超碰人人 | 国产精品美女久久久久久免费 | 99久久精品国产免费看不卡 | 国内毛片毛片 | 91精品啪在线观看国产线免费 | 成人a大片| 久久精品久久精品久久39 | 亚洲日本欧美 | 国内小视频在线观看 | 在线观看一区 | 亚洲国产中文字幕在线 | 久久国产亚洲精品 | 五月香视频在线观看 | 国产不卡在线观看 | 国产一级大片免费看 | 久久久午夜电影 | 日韩精品网址 | 国产午夜精品免费一区二区三区视频 | 国产婷婷一区二区 | 午夜精品久久久久久久99无限制 | 懂色av一区二区三区蜜臀 | www.天天综合 | 久久精品亚洲一区二区三区观看模式 | 日本公妇在线观看 | 日日夜夜精品视频天天综合网 | 日韩av一区二区在线 | 91三级视频 | www.夜夜骑.com | avove黑丝 | 中文在线免费视频 | 日韩视频免费 | 美女露久久 | 激情视频综合网 | 三级黄色免费 | 精品国产一区二区在线 | 91精品国自产在线观看欧美 | 亚洲欧美日韩不卡 | 国产在线一卡 | 91av综合| 青青河边草观看完整版高清 | 99热在线观看 | 国产精品国产亚洲精品看不卡15 | 国产高清视频在线播放 | 日本黄色a级大片 | 97视频资源 | 91在线免费视频 | 国产一级在线免费观看 | 成人福利在线 | 亚洲干| 日本爱爱片 | 成人国产精品久久久久久亚洲 | 天天综合网国产 | 在线免费av电影 | 天天弄天天操 | 99精品一区二区三区 | 日韩欧美国产激情在线播放 | 久久高清国产 | 激情综合交 | 99在线视频观看 | 久久久麻豆视频 | 99re热精品视频 | av大片免费在线观看 | 久久久国产高清 | 色综合综合 | 国产99久久久国产 | 麻豆久久久久 | 一区二区三区免费在线观看 | 最新av免费在线观看 | 91看片在线看片 | 日韩在线高清 | 伊人色**天天综合婷婷 | 天天做日日做天天爽视频免费 | 久久久久国产一区二区三区 | 久久国产网站 | 日韩久久久久久久久久久久 | 精品视频久久久 | 欧美日韩在线看 | 很黄很黄的网站免费的 | 国产在线观看a | 成人毛片100免费观看 | 深夜福利视频一区二区 | 一区二区理论片 | 日韩视频中文字幕在线观看 | 久保带人| 天天综合五月天 | 深夜免费福利网站 | 少妇性xxx | 欧美日韩高清不卡 | 国内精品久久久久久 | 最近中文字幕完整视频高清1 | 婷婷激情综合网 | 午夜精品一区二区三区在线视频 | 日韩激情第一页 | 91福利在线导航 | 日日夜夜网站 | 日日躁夜夜躁aaaaxxxx | 黄色www在线观看 | 99久久久久久久久 | 亚洲a免费| av黄色一级片 | 狠狠色狠狠色合久久伊人 | 日韩久久精品一区二区三区下载 | 久久久久久蜜桃一区二区 | 国内精品久久久久久久影视麻豆 | 亚洲激情小视频 | 91看片在线免费观看 | 在线 日韩 av| 亚洲女裸体 | 婷婷六月在线 | 国产五月 | 亚洲欧美视频网站 | 国产精品视频专区 | 天天草天天插 | 超碰在线色| 国产视频网站在线观看 | 黄色成人小视频 | 国产精品久久久久久69 | 一级黄视频 | 麻豆视频免费版 | 中文字幕一二三区 | 国产第一页在线播放 | 国产精品亚洲片夜色在线 | 久久精品人人做人人综合老师 | 成人h动漫在线看 | 亚洲成a人片在线观看网站口工 | 日韩二区在线观看 | 久久久久久久久久久免费 | 亚洲h在线播放在线观看h | 在线99热| 亚洲精品午夜国产va久久成人 | 少妇bbb搡bbbb搡bbbb′ | 91成人破解版 | 中文字幕一区在线 | 成人不用播放器 | 青青草在久久免费久久免费 | 成人app在线免费观看 | 五月天久久久久 | 国产日产av | 九九热久久久 | 亚洲美女免费视频 | bbb搡bbb爽爽爽 | 久久夜色精品国产欧美一区麻豆 | 国产一级特黄毛片在线毛片 | 69视频永久免费观看 | 久久艹艹 | av电影久久 | 国产高清视频在线 | 手机av电影在线观看 | 国产精品国产三级国产不产一地 | 亚洲一区二区麻豆 | 中文在线字幕免费观 | 亚洲精品看片 | 综合色狠狠 | 91超级碰碰 | 黄色片网站 | 九色视频网 | 成人精品视频 | 最新国产精品拍自在线播放 | 中文免费观看 | 草久视频在线 | 国产永久免费高清在线观看视频 | 97超碰在线人人 | 香蕉视频免费看 | 亚洲精品国产精品乱码不99热 | 色wwwww| 精品黄色在线观看 | 日韩三级免费观看 | 欧美性色综合网站 | 日本激情中文字幕 | www.久久99 | 中文一区二区三区在线观看 | 顶级bbw搡bbbb搡bbbb | 成人免费视频在线观看 | 亚洲六月丁香色婷婷综合久久 | 国产伦精品一区二区三区照片91 | 亚洲精品在线网站 | av免费电影网站 | 视频 天天草 | 亚洲a成人v| 久久九九久久精品 | 午夜av色 | 又黄又爽又刺激的视频 | 天天五月天色 | 黄色av电影免费观看 | 国产精品久久久久久久久久久久午夜 | 日韩黄色免费 | 91资源在线免费观看 | 一本一道波多野毛片中文在线 | 人人爽人人澡 | 中文资源在线官网 | 久久综合加勒比 | 在线观看黄色免费视频 | 婷婷日 | 在线免费观看黄色大片 | 丁香视频 | 不卡在线一区 | 香蕉影院在线播放 | 中文字幕在线观看日本 | 色婷婷亚洲 | 久久精品96 | 久久免费视频一区 | 日韩在线视频二区 | 欧美激情综合五月色丁香小说 | 一级片视频免费观看 | 91精品入口 | 中文字幕精品在线 | 久久国语 | 欧美日韩国产高清视频 | 人人爽人人爽人人片av | 色九色| 成人在线观看日韩 | 国产成人av电影在线 | 麻豆精品视频在线观看免费 | 99精品在线视频播放 | 四虎5151久久欧美毛片 | 天天射夜夜爽 | 中文字幕在线电影 | 免费国产一区二区 | 久久精品久久99精品久久 | 国产精品亚洲片夜色在线 | 日韩一三区| 国产精品久久久久久久久久妇女 | 这里有精品在线视频 | 国产日韩欧美在线观看视频 | 亚洲国产精彩中文乱码av | 欧美日韩中 | 国产破处视频在线播放 | 欧美成年网站 | 国产蜜臀av| 亚洲国产精品视频在线观看 | 狠狠狠色丁香婷婷综合激情 | 国产成年免费视频 | 天天综合久久综合 | 久久伊人精品天天 | 天天爱天天操天天射 | 国产视频一区精品 | 国产免费区| 中文字幕亚洲字幕 | 在线看一区 | 国产日韩中文字幕 | 成人aaa毛片 | 国产69精品久久99不卡的观看体验 | 久久国产精品色婷婷 | 精品黄色片 | 成人久久亚洲 | 91热在线 | 色资源二区在线视频 | 日本精品久久 | 99久久婷婷国产精品综合 | 黄色91在线 | 91精品婷婷国产综合久久蝌蚪 | 五月婷婷导航 | 天堂av在线中文在线 | 日日夜夜精品视频 | 亚洲毛片视频 | 色综合久久久 | 久久国产露脸精品国产 | av亚洲产国偷v产偷v自拍小说 | www.夜夜爽| 国产免费国产 | 色一级片 | 久草视频国产 | 成人在线免费小视频 | 日p在线观看 | 西西人体4444www高清视频 | 国产精品日韩欧美一区二区 | 中文字幕在线观看视频一区 | www.色婷婷.com| 999色视频 | 久久久国产精华液 | 中文av一区二区 | 亚洲免费婷婷 | 久久婷婷一区二区三区 | 毛片一区二区 | 成人 亚洲 欧美 | 日韩成人免费观看 | 日日夜夜天天 | 天天色天天操天天爽 | avwww在线 | 97超碰福利久久精品 | 成年人免费看的视频 | 欧美一级特黄高清视频 | 午夜色影院 | 国产一区二区在线影院 | 亚洲国产激情 | 国产黄网站在线观看 | 久久综合精品一区 | 欧美日韩不卡在线 | 97日日碰人人模人人澡分享吧 | 粉嫩aⅴ一区二区三区 | 欧美在线一级片 | 日韩精品久久久久久中文字幕8 | 亚洲国产中文在线观看 | 天天天干天天天操 | 天天色欧美| 人人爽人人片 | 美女视频黄在线观看 | 久草资源在线观看 | 亚洲精品视频在线观看免费视频 | 天天操天天射天天爽 | 综合久久2023 | 国产精品免费久久久 | 日韩欧美aaa | 996久久国产精品线观看 | 国产精品一区二区三区四区在线观看 | 97超碰人人爱 | 日韩最新av在线 | 久草在线免费播放 | 日韩欧美一区二区不卡 | 亚洲精品国产精品乱码不99热 | 1024手机在线看 | 欧美视频www | 国产免费亚洲 | 最新日韩精品 | 亚洲一区二区观看 | 人人艹视频 | 国产成人三级在线 | 欧美精品久久久 | 国产高清视频免费观看 | 又色又爽又黄高潮的免费视频 | 国产精品短视频 | 操操操av | 欧美精品乱码99久久影院 | 精品国产乱码久久 | 玖玖爱国产在线 | 国产精品成人免费一区久久羞羞 | 日韩中文字幕国产精品 | 久久99视频免费观看 | 另类五月激情 | 中文字幕在线观看一区二区三区 | 日韩av伦理片 | 蜜臀久久99静品久久久久久 | 伊人网站 | 日韩视频专区 | 九九九毛片 | 99精品国产亚洲 | 日本精品视频在线播放 | 精品嫩模福利一区二区蜜臀 | 黄色在线小网站 | 国产黄色片网站 | 日韩精品 在线视频 | 国产精品刺激对白麻豆99 | 九九久| 日韩一级黄色av | 9999亚洲 | 最近中文字幕高清字幕在线视频 | 激情网第四色 | 国产精品18久久久久久久网站 | www色综合 | 欧美巨乳网 | www.色午夜.com| 又黄又爽又刺激视频 | 91九色国产在线 | 五月天激情电影 | 视频在线99 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 天天操天天干天天操天天干 | 色噜噜狠狠狠狠色综合久不 | 午夜精品av在线 | 日本中文字幕观看 | 伊人久久av| 色视频在线看 | 色偷偷888欧美精品久久久 | 一区二区三区韩国免费中文网站 | 国产日韩在线一区 | 99久久夜色精品国产亚洲 | 国产成人一区二区精品非洲 | 国产不卡高清 | 在线视频1卡二卡三卡 | 久久久 激情 | 久草免费在线观看视频 | 日产乱码一二三区别在线 | 久久激情视频 久久 | 麻花豆传媒mv在线观看网站 | www.亚洲精品在线 | 久久久受www免费人成 | 五月综合在线观看 | 伊人午夜视频 | 久久av不卡 | 国产尤物在线 | 91成人免费在线 | 国产视频亚洲视频 | 99免费在线观看 | 色六月婷婷| 久久综合福利 | 韩国在线视频一区 | 欧美日韩在线免费观看视频 | 国产精品国内免费一区二区三区 | 久久久高清 | 日韩精品一卡 | 91视频网址入口 | 中文字幕在线观看资源 | 99久久婷婷国产 | 在线观看国产 | 视频三区在线 | 91在线精品视频 | av噜噜噜在线播放 | 日韩精品免费在线播放 | 天天操天天干天天爱 | 去干成人网| 久久黄色影视 | 狠狠色狠狠色 | 成人91av | 久久福利影视 | 91av在线国产 | 深爱开心激情 | 日韩精品一区二区三区在线播放 | 国产91在线播放 | 国产97在线看 | 国产日韩在线观看一区 | 成人av片在线观看 | 一区二区三区免费在线 | 亚洲国产日韩精品 | 99久久精品免费看国产 | 在线观看完整版 | 日韩大片在线免费观看 | 中文字幕欲求不满 | 亚州av免费 | 国产福利a | 99久久99 | 国产亚洲在线视频 | 中文字幕乱码在线播放 | 久久精品一区二区三区四区 | 五月激情五月激情 | 91精品久久久久 | 久久少妇免费视频 | 亚洲婷婷综合色高清在线 | 丝袜足交在线 | 91精品人成在线观看 | 国产在线欧美 | 成人国产精品一区二区 | 久久久久久毛片精品免费不卡 | 日韩电影中文字幕在线观看 | 欧美视频99| 天天爱天天操 | 日韩中文字幕免费电影 | 欧美日韩在线视频观看 | 免费一级日韩欧美性大片 | 美女国产免费 | 国产在线精品福利 | 黄色一级免费电影 | 99久久久久国产精品免费 | 国产一级在线免费观看 | 天堂va欧美va亚洲va老司机 | 亚洲精品国偷拍自产在线观看 | 91精品国自产在线观看 | 久99久中文字幕在线 | 免费观看国产成人 | 日本精品视频免费 | 国产久视频 | 日韩午夜三级 | 在线 影视 一区 | 国产91精品看黄网站在线观看动漫 | 五月丁婷婷 | 91视频午夜 | 国产午夜精品久久 | 人九九精品 | 国产欧美高清 | 丁香亚洲| 日韩欧美一区二区三区在线观看 | 欧美专区日韩专区 | 99久久99久久免费精品蜜臀 | 国产亚洲精品久久久久久移动网络 | 久久久久久久久久久免费视频 | 中文字幕在线高清 | 日本久久成人中文字幕电影 | 欧美性大战久久久久 | 亚洲免费成人av电影 | 在线免费观看视频一区二区三区 | 在线中文字母电影观看 | 欧美国产日韩在线观看 | 中文字幕日本在线 | 久久久久亚洲精品成人网小说 | 一区二区三区高清 | 综合激情婷婷 | 91成人在线观看高潮 | 久久国产精品小视频 | 久久不射电影院 | 色在线视频 | 天天爱天天色 | 日本在线中文在线 | 久久亚洲视频 | 免费av片在线 | 精品九九九九 | av千婊在线免费观看 | 99理论片 | 国产免费久久 | 久久精品免费看 | 亚洲91中文字幕无线码三区 | 国产精品国产三级国产aⅴ入口 | 91精品国产综合久久久久久久 | 欧美日韩精品网站 | 激情视频在线观看网址 | 久久成视频 | 日韩在线观看网址 | 久久99热精品这里久久精品 | 伊人日日干 | 国产黄网在线 | 国产精品你懂的在线观看 | 久久免费视频在线观看 | 久久手机精品视频 | 日韩专区一区二区 | 精品免费视频. | www狠狠操 | 三级黄色片子 | 欧美日韩免费观看一区二区三区 | 超碰在线9 | 精品国产不卡 | 日韩视频一区二区在线 | 久久尤物电影视频在线观看 | 国产黄色一级片在线 | 成人一级 | 少妇高潮流白浆在线观看 | 日本aaaa级毛片在线看 | 久久人人爽人人片 | 国产高清绿奴videos | 特黄色大片 | 天天色天天射天天操 | 国产精品一区二区美女视频免费看 | 精品国产区在线 | 亚洲精品色视频 | 成人一级免费电影 | 五月激情综合婷婷 | 午夜视频亚洲 | www最近高清中文国语在线观看 | 精品国产片 | 精品99久久久久久 | 五月婷婷开心 | 欧洲精品在线视频 | 九九热免费视频在线观看 | 久综合网| 久一网站 | 亚洲美女视频网 | av一级久久 | 久久久香蕉视频 | 最新极品jizzhd欧美 | 久久av福利 | 日韩av网址在线 | 欧美性另类 | 亚洲一级片 | 狠狠操天天射 | 亚洲国产精品传媒在线观看 | 久久久99国产精品免费 | 91精彩在线视频 | 婷婷激情五月 | 五月婷香蕉久色在线看 | 在线中文字幕播放 | 日本护士撒尿xxxx18 | 高清免费在线视频 | 91亚洲夫妻 | 福利片视频区 | 日本黄区免费视频观看 | 又黄又爽免费视频 | 天天狠狠 | 色www永久免费 | 一级一片免费视频 | 成人欧美一区二区三区黑人麻豆 | 久久毛片网站 | 碰超在线 | 一区二区高清在线 | 看黄色91 | 不卡日韩av | 国产精品久久久久久爽爽爽 | 久久综合九色99 | 天天干夜夜干 | 少妇bbb好爽 | 日韩精品91偷拍在线观看 | 日韩网站一区二区 | 成人小视频在线免费观看 | 国产又黄又硬又爽 | 丁香六月伊人 | 视频在线99 | 蜜臀av.com | 国产黄色在线观看 | 国产精品免费看久久久8精臀av | 夜夜操天天 | 亚洲精品在线观看的 | 日韩av资源站 | 五月天婷婷狠狠 | 精品久久一级片 | 激情五月综合网 | 999久久久久久久久 69av视频在线观看 | 久久精品香蕉视频 | 久久国产精品99久久久久 | 黄色午夜| 九色在线 | 欧美另类美少妇69xxxx | 五月婷婷视频在线 | 夜夜操天天摸 | av在线播放网址 | 十八岁以下禁止观看的1000个网站 | 国产成人av电影在线观看 | 99国产精品久久久久老师 | 成人av免费在线播放 | 国产91勾搭技师精品 | 91在线国内视频 | 久久99国产精品自在自在app | 国产理论影院 | 国产精品欧美日韩 | 天堂在线免费视频 | 亚洲成人一二三 | 天天插天天狠天天透 | 午夜精品久久久久久久久久久久久久 | 五月开心激情网 | 日韩在线免费电影 | 日本韩国在线不卡 | 色偷偷人人澡久久超碰69 | 黄色aaa级片 | 91福利试看|