PHPには、配列という非常に強力なツールが含まれています。 PHPの関数の半分は、結果を連想配列として返します。 このような関数を使用する場合、配列のキーの名前を間違えるのは簡単です。 これは経験豊富な開発者にとって問題ではないことは明らかですが、初心者にとっては、特に巨大なjsonを取得したり、レガシーなレガシーコードを修正したりすると、頭痛の種になることがよくありますが、非プログラマーにとっては... 。
これは、配列をオブジェクト/コレクションとして使用できるようにするトリックです。 おそらく、それは誰かにとっては愚かに見えるかもしれませんが、誰かがアプリケーションのアイデアを出します。
確認する必要のある他のIDEで、実装がPHPStormで機能していることを直ちに予約します。
いくつかの例は天井から取られ、いくつかはInstagram APIから取られます。
最初の例。
例
例1.フォームデータを操作します。
フォームは次のとおりです。
<form method="post" action="actionurl?route=myroute"> <label for="id">clientID:</label><input id="id" name="id" type="text" value="6041eee77ac94e6ba83fbcec61ad46c4"><br> <label for="secret">ClientSecret:</label><input id="secret" name="secret" type="text" value="539141addd854a8c8d431465d6016590"><br> <label for="tag">Tag:</label><input id="tag" name="tag" type="text" value=""><br> <input type="submit" value="subscribe" name="subscribe"> | <input type="submit" value="unsubscribe" name="subscribe"> | <input type="submit" value="list" name="subscribe"> </form>
送信すると、$ _POSTを受け取ります。 私はいつもこの使用が好きではありませんでした(キー存在テストを省略します)
$id = $_POST['id];
IDEのすべての機能を使用し、POSTの変数を前に知ることは、はるかに興味深いことです。
フォームのクラスを作成します。
class MyForm extends Post { const SUBSCRIBE = 'subscribe'; const UNSUBSCRIBE = 'unsubscribe'; const LIST_ = 'list'; }
まあ、そのような「クラス」を使用した結果
私たちが何を扱っているのかすぐにわかります。
例2.セッションを操作します。
セッションをできる限りシンプルにする必要があります。
私たちのクラス:
class MySession extends Session{ function __construct() { parent::__construct('mySession'); } }
セッションのクラス(ArrayClassコードは最後にあります):
class Session extends ArrayClass { function __construct($arrayName = 'session') { if(!isset($_SESSION[$arrayName])) $_SESSION[$arrayName] = array(); parent::__construct($_SESSION[$arrayName]); } public static function init(){ session_start(); } }
これにより、次のように落ち着いて作業できます。
$s = new MySession();
$s->var1 = 10;
すべてがシンプルで透明です。
例3. Instagram、json、および複雑な配列
APIを呼び出す必要があります。 このようにします:
$response = file_get_contents("https://api.instagram.com/v1/tags/instaprint/media/recent?access_token=14135310***************************9f2a26b8a"); $r = new Response(json_decode($response, true));
クラスコード:
少しのInstagram API class Response extends \ArrayClass { public function getMeta(){ return new Meta($this->get('meta')); } public function getPagination(){ return new Pagination($this->get('pagination')); } } class Meta extends \ArrayClass { } class Pagination extends \ArrayClass { } class TagData extends \ArrayClass { public function getImages(){ return new Images($this->get('images')); } public function getCaption(){ return new Caption($this->get('caption')); } public function getUser(){ return new User($this->get('user')); } } class Images extends \ArrayClass { function __get($name) { return new Image($this->$name); } } class Image extends \ArrayClass { } class Caption extends \ArrayClass{ public function getFrom(){ return new User($this->get('from')); } } class User extends \ArrayClass{ }
IDEでの表示:
2語で。 Instagramからjsonを取得し、クラスでラップします。 出力では、IDEからクラス構造とヘルプを取得します。
さて、今ArrayClass自体:
class ArrayClass implements Iterator { private $array;
完全なArrayClassコード<?php
class ArrayClass implements Iterator { private $array; private $haveNext = false; function __construct(&$array) { if($array === null) $array = array(); if($array instanceof ArrayClass){ $this->array = &$array->array; } else if(is_string($array)){ $this->array = json_decode($array, true); } else{ $this->array = &$array; } $this->rewind(); } function __get($name) { return $this->get($name); } function __set($name, $value) { $this->array[$name] = $value; } function __isset($name) { return isset($this->array[$name]); } function __unset($name) { unset($this->array[$name]); } public function get($index){ if(isset($this->array[$index])){ if(is_array($this->array[$index])){ return new ArrayClass($this->array[$index]); } return $this->array[$index]; } return null;
配列のラッパーを作成し、このラッパーにいくつかの興味深い機能を提供します。
- ユニバーサルコンストラクター。 配列($ _POST、$ _GETなどからでも)、同様のArrayObject、json文字列からオブジェクトを作成できます。
- デジタル値(0..n)に便利なキー値を取得するgetメソッドは、テキストキーを含む配列のfor($ i)$ a-> get($ i)ループで使用できます。
- まあJSON()-JSONでラップするだけ
出力は次のとおりです。
または、子クラスにチェックを追加できます。
プラスは、1年以内に自分または他の誰かのIDEコードにアクセスした場合、ヒントが提供され、$ _GET ['magic']および同様のコード行にあるマジック定数を理解するためにプロジェクトコードの半分を読み直す必要がないことです。
メモリ使用量とパフォーマンスに関する追加情報がある場合は、コメントで登録解除してください。 ありがとう
PS
GET、POST、SESSION class Get extends ArrayClass { function __construct() { parent::__construct($_GET); } } class Post extends ArrayClass { function __construct() { parent::__construct($_POST); } } class Session extends ArrayClass { function __construct($arrayName = 'session') { if(!isset($_SESSION[$arrayName])) $_SESSION[$arrayName] = array(); parent::__construct($_SESSION[$arrayName]); } public static function init(){ session_start(); } }