エセプログラマーの戯言

プログラムやリナックスなどについてのメモです

PHP

[ リスト | 詳細 ]

記事検索
検索

全6ページ

[1] [2] [3] [4] [5] [6]

[ 次のページ ]

PHPをC++に変換

PHPをC++に変換するものを発見しました。


早速使ってみましたが、ちょっとバグがありました。

tokenflow.phpというファイルで、$definesという変数が二重で宣言されてるので、ひとつをコメントアウト

...
var $functions = array('main');
var $defines = array();
var $cppincludes = array();
var $namespace;
var $tabs = 0;
var $scope = array();
var $funccount = 1;
var $inclass = false;
var $classes = array();
var $curclass = 0;
var $foreach = 0;
var $defines = array(); //←ここ
var $objects = array();
var $inswitch = 0;
var $switchstate = array();
...

...
var $functions = array('main');
var $defines = array();
var $cppincludes = array();
var $namespace;
var $tabs = 0;
var $scope = array();
var $funccount = 1;
var $inclass = false;
var $classes = array();
var $curclass = 0;
var $foreach = 0;
//var $defines = array();
var $objects = array();
var $inswitch = 0;
var $switchstate = array();
...

これで無事実行できるようになりました。

ただ、自分のプログラムを変換したら、C++ファイルは出来たものの、コンパイルエラーで実行ファイルは出来ませんでした。

READMEを見てみたら、どうも2003年ごろ作られたもののようで、PHP5には対応してないっぽい感じでした。

また、いろいろ実験して試してみたいと思います。
PHPで、マッシュアップを行う場合、通常だと逐次処理になってしまうため、使うWebAPIが多くなればなるほど処理が重くなってしまいます。

最近作成したものが、非常に重く使い物にならなかったので、何か良い方法はないかと調べたところありました。


これは、かなり使えそうですね!

WebAPIクラス

最近、WebAPIを使うことが多くなってきたので、以前作ったクラスを紹介したいと思います。


とりあえず、わかりきってる処理は、全て抽象クラスで実装しちゃおうって考えです。
ちなみに、xmlしか対応してません。

抽象クラス

  /******************************
   * WebAPIの抽象クラス
   * 2008.06.22 (C) よっくん
   *****************************/

abstract class AbstractWebApi{
  protected $appid;
  protected $url;
  protected $id;
  protected $param;
  protected $results;

  public function __construct($appid){
    $this->appid = $appid;
    $this->url = $url;
    $this->id = 0;
    $this->param = array();
    $this->results = array();
  }

  abstract public function results_set($xml);

  public function set($index, $value){
    foreach(array_keys($this->param) as $key){
      if($index == $key){
        $this->param[$index] = $value;
        break;
      }
    }
  }

  public function record($id){
    if(!isset($this->results[$id])){
      return false;
    }
    $this->id = $id;
    return true;
  }

  public function get($index, $default=""){
    return isset($this->results[$this->id]->$index) ? $this->results[$this->id]->$index : $default;
  }

  public function request_url_set($url){
    foreach($this->param as $key => $value){
      if($value !== null){
        $this->url .= '&'.$key. "=".$value;
      }
    }
  }

  public function request(){
    $this->request_url_set();
    $xml = simplexml_load_file($this->url);
    $this->results_set($xml);
  }
}

サブクラス

さて、サブクラスは、例えば、ぐるなびのWebサービスを実装する場合、
  /**********************************
   * ぐるなびレストラン検索 クラス
   * 2008.06.22 (C) よっくん
   *********************************/
require_once 'AbstractWebApi.class.php';

class GnaviShopSearch extends AbstractWebApi{

  public function __construct($appid){
    parent::__construct($appid);
    $this->url = 'http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid='.$this->appid;
    $this->param['id'] = null;
    $this->param['name'] = null;
    $this->param['name_kana'] = null;
    $this->param['tel'] = null;
    $this->param['address'] = null;
    $this->param['area'] = null;
    $this->param['pref'] = null;
    $this->param['category_l'] = null;
    $this->param['category_s'] = null;
    $this->param['input_coordinates_mode'] = null;
    $this->param['equipment'] = null;
    $this->param['coordinates_mode'] = null;
    $this->param['latitude'] = null;
    $this->param['longtitude'] = null;
    $this->param['range'] = null;
    $this->param['sort'] = null;
    $this->param['offset'] = null;
    $this->param['hit_per_page'] = null;
    $this->param['offset_page'] = null;
    $this->param['freeword'] = null;
    $this->param['freeword_condition'] = null;
  }

  public function results_set($xml){
    $this->results = $xml->rest;
  }
}

まず、リクエストパラメータを格納する$this->paramをnullで定義します。
必要なパラメータだけで良いんですが、とりあえず、全部定義してました。

んで、結果を格納する$this->resultsに、結果で欲しいものを格納します。この場合、レストラン情報が欲しいので、$xml->restを格納しています。

使い方

このクラスの使い方は、

require_once 'GnaviShopSearch.class.php';

$keyid='xxxxxxxxxx'; //発行されたアクセスキー
$shop = new GnaviShopSearch($keyid);
$shop->set('freeword', '沖縄そば'); //リクエストパラメータをセット
$shop->request();

for($i=0; $shop->record($i); $i++){
   echo $shop->get('name')."<br />";
}

まぁ、こんなクラスを作らなくても、簡単に出来るのが、WebAPIなんですが、管理しやすくなるんじゃないかなぁと思います。

何かおかしいところとか、意見とかありましたら、よろしくお願いします。

コズみく

先週の日曜日に、突然友達から、

「ネットゲーのブログをオリジナルでやりたいから、作って♪」

などと、言われ一週間ほどで何とか形にしました。


まだまだ、改良の余地がありますが、一週間(実作業時間24時間程)という短期間でこれだけ作れたので、自分も少しは成長しているのかなと思いました。


管理画面の方では、記事の投稿、編集、削除、機体の登録、画像の登録などが出来るようになっています。
んで、右にフキダシか左にフキダシ、画像だけ、文章だけの4パターンを組み合わせて本文を作り、出来上がったものを投稿って感じです。


自分は、ネットゲーをやっていないので内容はよく分からないのですが、何か意見があったらよろしくお願いします!

MVCモデル

ちょっと、時間がないので、メモ程度にアップします。


まず、表示するデータを格納するクラス。
このクラスでは、画面に表示するデータを格納し、HTML特殊文字をサニタイズして取り出します。
<?php
  /*----------------------------
   * パラメータを格納するクラス
   * 2008/05/18 (C) Yokkun
   *--------------------------*/
  
class Param{
  protected $param;

  public function set($index, $value, $h=true){
    if($h){
      $this->param[$index] = h($value);
    }
    else{
      $this->param[$index] = $value;
    }
  }

  public function get($index, $default=""){
    return isset($this->param[$index]) ? $this->param[$index] : h($default);
  }
}

function h($arr){
  if(is_array($arr)){
    return array_map("h", $arr);
  }
  $arr = htmlspecialchars($arr);
  return $arr;
}
?>


次に、コントローラークラス。
このクラスでは、前回作ったRequestクラスを使ってリクエストデータを受け取り、
適切な処理を行うように制御します。
<?php
  /*--------------------------
   * Controllerの抽象クラス
   * 2008/05/18 (C) Yokkun
   *------------------------*/
require_once 'Request.class.php';
require_once 'Param.class.php';

abstract class AbstractController{
  protected $request;
  protected $param;
  protected $dir;
  public function __construct(){
    $this->request = new Request;
    $this->param = new Param;
    $this->dir = "../templates/"; //テンプレートを設置しているディレクトリ
  }

  //各ページの処理の実行
  public function exec(){
    $action = $this->request->get("action", "top");
    $this->$action();
    $this->display($action);
  }
  //存在しないページ
  public function __call($method, $args){
    $this->error_page("このページは存在しません。");
  }
  //エラーページ
  public function error_page($message="ERROR!"){
    die($message);
  }

  //画面出力
  public function display($action){
    $param = $this->param;
    include_once $this->dir.$action.".phtml";
  }
}
?>

GETデータのactionで、ページを制御しています。
具体的には、サブクラスで、actionで指定するページをメソッドとして実装し、メソッドが存在しない場合はエラーページを表示します。

具体的な説明や使いかたは、また次回にします。

全6ページ

[1] [2] [3] [4] [5] [6]

[ 次のページ ]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事