PHP ၏ FFI (နိုင်ငံခြား function interface) extension သည် PHP တွင် Cite function များနှင့်ဒေတာတည်ဆောက်ပုံများကို PHP တွင်တိုက်ရိုက်ပါ 0 င်ရန်ခွင့်ပြုသည်။ သို့သော် ၎င်းကို နက်ရှိုင်းစွာအသုံးပြုသည်နှင့်တပြိုင်နက်သင်သည်လျှို့ဝှက် "မိုင်းများ" အချို့ကိုတွေ့လိမ့်မည် ။
ကျွန်ုပ်တို့တွင်ရိုးရှင်းသော C တည်ဆောက်ပုံရှိသည်ဆိုပါစို့။
typedef struct {
int x;
int y;
} Point;
PHP ၏ FFI :: CDEF () ကြေငြာချက်ကိုကျွန်ုပ်တို့အသုံးပြုသည်။
$ffi = FFI::cdef("
typedef struct {
int x;
int y;
} Point;
");
ထိုအခါသင်သည်ဤကဲ့သို့သောကိုသုံးနိုင်သည်:
$point = $ffi->new("Point");
$point->x = 10;
$point->y = 20;
echo "Point: ({$point->x}, {$point->y})\n";
အရာအားလုံးပုံမှန်အပြေးနေသည်။ ယခုမေးခွန်းမှာ - တည်ဆောက်ပုံကို ရေးရန်မေ့သွားလျှင်ဘာဖြစ်မည်နည်း။
C ဘာသာစကားတွင် စရိုက်အမှတ် နှင့် အမှတ်တို့တွင် ကွဲပြားခြားနားသော namespace နှစ်ခုရှိသည်။ Typelef ကို မသုံးပါက အမှတ်သည် မှန်ကန်သောအမျိုးအစားအမည်မဟုတ်ပါ။ PHP ၏ FFI :: CDEF () CDEF () တွင်အခြေအနေအနည်းငယ်ကွဲပြားခြားနားသည်။ ၎င်းသည် C costiler ၏စည်းကမ်းချက်များနှင့်အနည်းငယ်ကွဲပြားသည်။
ဥပမာအားဖြင့်, သင်ဤကဲ့သို့သောကြေညာချက်ရေးသားခဲ့သည်:
$ffi = FFI::cdef("
typedef struct Point {
int x;
int y;
} Point;
");
$pt = $ffi->new("Point");
ဒီကုဒ်ကအဆင်ပြေပါတယ် သို့သော်သင်သည် လိင်အင်္ဂါ အစိတ်အပိုင်းကိုဂရုမစိုက်ပါကဥပမာ -
$ffi = FFI::cdef("
struct Point {
int x;
int y;
};
");
$pt = $ffi->new("Point"); // အမှားတစ်ခုဖြစ်ပွားခဲ့သည်
ဤတွင် $ ffi-> "POINT" အသစ် ("POINT") က ခြွင်းချက်တစ်ခုချပစ်လိမ့်မည်။ ဘာဖြစ်လို့လဲဆိုတော့ဒီအချိန်မှာ "point" ဆိုတာဟာသီးခြားစီ alias မဟုတ်ဘဲ strace point တစ်ခု ဖြစ်တယ်။
မှန်ကန်သောခေါ်ဆိုမှုမှာ -
$pt = $ffi->new("struct Point");
ဤသည်မှာလူအများအပြားကျဆင်းနေသည့်ထောင်ချောက်ဖြစ်သည်။ သူတို့ကဖွဲ့စည်းပုံအမည်ကို "point" ဟုသတ်မှတ်ကြသော်လည်းအမှန်တကယ်တွင်သင်သည် "struct point" ကိုသာသတ်မှတ်ကြသည်။ အကယ်. သင်သည်စာရိုက်ခြင်းမပြုပါကသင်အမှတ်ကိုတိုက်ရိုက်မသုံးနိုင်ပါ။
အောက်ဖော်ပြပါအမှားတစ်ခုကိုသင်မြင်လျှင် -
FFI\Exception: undefined C type 'Point'
ထို့နောက်သင်သည် CDEF တွင်မည်သို့ကြေငြာသည်ကိုစစ်ဆေးရန်လိုအပ်သည်။ စာရိုက်ခြင်းမရှိဘဲ စလွယ်နည်းအမှတ်ကို ရေးခဲ့သလား။ သို့ဆိုလျှင်သင်သာရည်ညွှန်းရန် struct point ကို သာသုံးနိုင်သည်။
Debugging Technique သည်သင်၏ CDEF () ကြေငြာချက်ကိုပုံနှိပ်ထုတ်ဝေရန်ဖွဲ့စည်းပုံတွင်စာရိုက်ခြင်းရှိမရှိစစ်ဆေးရန်ဖြစ်သည်။
echo $ffi->cdef;
ဤနည်းလမ်းသည်အစဉ်အမြဲအလုပ်လုပ်သည် (အထူးသဖြင့် PHP ဗားရှင်းအချို့တွင်) သည်အလုပ်မလုပ်သော်လည်းအမျိုးအစားမှန်ကန်စွာမှတ်ပုံတင်ထားကြောင်းအတည်ပြုရန်ကူညီနိုင်သည်။
ရှုပ်ထွေးမှုများကိုရှောင်ရှားရန်, ဖွဲ့စည်းတည်ဆောက်ပုံဆိုင်ရာကြေငြာချက်များတွင် typeedef ကိုယူဆောင်လာရန်အကြံပြုသည်။ ဥပမာအားဖြင့်:
typedef struct {
int x;
int y;
} Point;
ဤနည်းအားဖြင့် PHP တွင် ဒေါ်လာ FFI-> POINT "အသစ် (" point ") ကိုပျော်ရွှင်စွာရေးနိုင်ပြီး struct ရှေ့ဆက်ကိုထည့်သွင်းရန်စိတ်ပူစရာမလိုတော့ပါ။
အခြားဖွဲ့စည်းပုံကိုအသိုက်ဖွဲ့စည်းထားသောဖွဲ့စည်းပုံတစ်ခုကိုသင်သတ်မှတ်သည်ဆိုပါစို့။
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point start;
Point end;
} Line;
FFI :: CDEF () PHP တွင်ဤကဲ့သို့သောစာဖြင့်ရေးသားသင့်သည် -
$ffi = FFI::cdef("
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point start;
Point end;
} Line;
");
ထိုအခါသင်သည်ဤကဲ့သို့သောကိုသုံးနိုင်သည်:
$line = $ffi->new("Line");
$line->start->x = 1;
$line->start->y = 2;
$line->end->x = 10;
$line->end->y = 20;
echo "Start: ({$line->start->x}, {$line->start->y})\n";
echo "End: ({$line->end->x}, {$line->end->y})\n";
အကယ် . သင်သည် Typefef တွင် TypeedF ကို လက်ယူလျှင်ဤအချက်သည် မှတ်စုစာအုပ် များမရှိပါက typeFeF မရှိပါ။ ထို့နောက် မျဉ်း ၏အဓိပ္ပါယ်သည်အမှားတစ်ခုဖြစ်လိမ့်မည်။
PHP FFI ကို အသုံးပြု. C ၏ဖွဲ့စည်းပုံကိုခေါ်ဆိုသည့်အခါအောက်ပါအချက်များကိုဂရုပြုရန်သေချာပါစေ။
အကယ်. ဖွဲ့စည်းပုံသည်စာရိုက်ခြင်းမရှိသေးပါကအမျိုးအစားအမည်ကို struct နှင့်ရှေ့ဆက်ရမည်
အဆောက်အအုံများကိုစိတ်ရှုပ်ထွေးမှုများကိုရှောင်ရှားရန်အဆောက်အအုံများအားလုံးသည် typef ကြေငြာချက်များကိုသုံးရန်အကြံပြုသည်
Debugging လုပ်တဲ့အခါငါ undefined အမျိုးအစားအမှားကြုံခဲ့ရတယ်။ CDEF ရှိကြေငြာချက်များသည်တသမတ်တည်းကိုပထမ ဦး ဆုံးစစ်ဆေးပါ။
ဤသတ်မှတ်ချက်များအားဖြင့်သင်သည် PHP နှင့် C interface ကိုကစားသည့်အခါသင့်အားထောင်ချောက်များကိုလျှော့ချရန်ခွင့်ပြုထားသောသေးငယ်သောအမျိုးအစားအမှားများကိုလျှော့ချနိုင်သည်။
PHP FFI နှင့် ပတ်သက်. ပိုမိုဥပမာများပိုမိုများပြားသောကြောင့် https:/gitbox.net/docs/php--ffi-expi-exampies ။