顯示廣告
隱藏 ✕
※ 本文為 dinos 轉寄自 ptt.cc 更新時間: 2016-12-09 17:16:09
看板 PHP
作者 Neisseria (Neisseria)
標題 [教學] 用 PHP-CPP 寫 PHP extension (2)
時間 Wed Dec  7 11:39:39 2016


延續上一篇,我們會展示另一個範例
在這個範例中,我們會建立 PHP 物件 (object),並呼叫其方法 (method)


如果想直接研究程式碼,可到這個 repo
https://github.com/cwchentw/matrix-php-extension-demo
GitHub - cwchentw/matrix-php-extension-demo
[圖]
Contribute to matrix-php-extension-demo development by creating an account on GitHub. ...

 


首先,實作 matrix 這個 toy library
在這裡,我們也是用 Rust 實作。同樣地,也要手動撰寫 header

#ifndef _MATRIX_H_
#define _MATRIX_H_

#ifdef __cplusplus
extern "C" {
#endif

  void* matrix_new(size_t, size_t);
  double matrix_get_at(void*, size_t, size_t);
  void matrix_set_at(void*, double, size_t, size_t);
  void matrix_free(void*);

#ifdef __cplusplus
}
#endif

#endif // _MATRIX_H_

為了簡化範例,我們沒有實作 matrix 的操作
僅建立 getter/setter,請板友包涵


同樣要下載 EmptyExtension 這個專案骨架,請板友自行完成。


接下來,實作 C++ 程式碼

#include <phpcpp.h>
#include "matrix.h"

class Matrix : public Php::Base
{
public:
  void* m; // Our matrix struct
  Matrix() = default; // Dummy constructor
  ~Matrix();
  void __construct(Php::Parameters&); // PHP constructor
  Php::Value get_at(Php::Parameters&);
  void set_at(Php::Parameters&);
};

Matrix::~Matrix()
{
  matrix_free(this->m);
}

void Matrix::__construct(Php::Parameters &params)
{
  this->m = matrix_new((int32_t)params[0], (int32_t)params[1]);
}

Php::Value Matrix::get_at(Php::Parameters &params)
{
  return matrix_get_at(this->m, (int32_t)params[0], (int32_t)params[1]);
}

void Matrix::set_at(Php::Parameters &params)
{
  matrix_set_at(this->m, (double)params[0],
                (int32_t)params[1], (int32_t)params[2]);
}

要特別注意 constructor 的部分。由於 PHP 不能直接使用 C++ 的 constructor
要額外建立一個 __construct 方法,並在裡面實做 constructor 的程式碼
另外建立一個 dummy constructor 給 C++ 用

在我們這個專案中,m 是實際從 Rust 輸出的 struct。
一般常規是將其設為 private,這裡將其設為 public
因為在 PHP 層級,不會動到這個 struct
將其設為 public 有利於物件操作 e.g. matrix 相乘


同樣地,將其輸出到 PHP

extern "C" {
    PHPCPP_EXPORT void *get_module()
    {
        static Php::Extension extension("matrix", "1.0");

        Php::Class<Matrix> matrix("Matrix");
        matrix.method<&Matrix::__construct>("__construct", {
            Php::ByVal("row", Php::Type::Numeric),
            Php::ByVal("col", Php::Type::Numeric)
        });
        matrix.method<&Matrix::get_at>("get_at", {
            Php::ByVal("row", Php::Type::Numeric),
            Php::ByVal("col", Php::Type::Numeric)
        });
        matrix.method<&Matrix::set_at>("set_at", {
            Php::ByVal("value", Php::Type::Float),
            Php::ByVal("row", Php::Type::Numeric),
            Php::ByVal("col", Php::Type::Numeric)
        });

        extension.add(std::move(matrix));

        return extension;
    }
}


最後,撰寫簡單的 PHP 程式測試此 PHP extension

<?php
// main.php
$m = new Matrix(3, 3);
echo $m->get_at(1, 1), "\n";
$m->set_at(99, 1, 1);
echo $m->get_at(1, 1), "\n";


若不想安裝 extension,也可從命令列呼叫

$ php -dextension=pwd/matrix.so main.php


這個範例到此大致上結束了

使用 PHP-CPP,仍然需要基本的 C++ 相關知識
而且,PHP-CPP 官網說明略為簡略,有時還是得去翻 PHP-CPP 的 header
如果使用 Zephir,可以用更接近 PHP 的語法來撰寫
那個方案較好,板友可再自行評估

分享給有需要的板友

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.36.80
※ 文章代碼(AID): #1OHuH-Kg (PHP)
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1481081982.A.52A.html
※ 編輯: Neisseria (125.227.36.80), 12/07/2016 11:51:00

--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 155 
作者 Neisseria 的最新發文:
  • +32 [問卦] 大家雙11都買了些什麼? - Gossiping 板
    作者: 111.249.46.37 (台灣) 2022-11-11 15:37:05
    安安。今天雙11 聽說雙11買東西會特別便宜 哥最近下訂了一批好便宜的 BND 聽說這東西好厲害的 放著就會長錢出來 大家雙11 都買了什麼?卦?
    58F 34推 2噓
  • +15 [新聞] 選情告急!民主黨不敢提經濟 - Gossiping 板
    作者: 111.249.1.168 (台灣) 2022-11-04 20:43:41
    美國期中選舉倒數最後一週,選情告急的民主黨全力衝刺,總統拜登與前總統歐巴馬,全 國輔選馬不停蹄,但超過半數選民最在乎的通膨經濟難題,民主黨卻絕口不提。對手共和 黨加緊猛攻,還傳出人氣不敗的前總統川普, …
    29F 15推
  • +27 [新聞] 程式語言Python受歡迎程度持續飆升 - Gossiping 板
    作者: 36.228.196.240 (台灣) 2022-08-10 18:10:05
    程式語言Python在熱門程式語言排行榜TIOBE Index中,目前制霸第一名且呈現勢不可擋 的成長趨勢,在本月又上漲2%,其市占達到15.42%的歷史新高,與去年同期相比成長了 3.56%。 TI …
    57F 30推 3噓
  • +42 [新聞] Google發表欲繼承C++的程式語言Carbon - Gossiping 板
    作者: 111.249.47.237 (台灣) 2022-07-22 18:42:44
    歷來不斷有新程式語言革新或試圖取代舊語言,像是Kotlin之於Java,或蘋果的Swift之 於Objective-C,以及微軟的TypeScript之於Javascript。Google本周在Cpp …
    84F 45推 3噓
  • +34 [問卦] 洗衣機的王者 - Gossiping 板
    作者: 114.25.211.178 (台灣) 2022-05-31 13:27:18
    各位年收入 300 萬的鄉民安安 電視機的王者是索尼 冷氣機的王者是日立 瓦斯爐的王者是櫻花 洗衣機的王者是?卦?
    70F 36推 2噓
點此顯示更多發文記錄
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇