配列からオブジェクトを作成します

画像

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の変数を前に知ることは、はるかに興味深いことです。

フォームのクラスを作成します。

 /* @property $id string*/ /* @property $secret string */ /* @property $tag string*/ /* @property $subscribe string value from MyForm::const*/ class MyForm extends Post { const SUBSCRIBE = 'subscribe'; const UNSUBSCRIBE = 'unsubscribe'; const LIST_ = 'list'; }
      
      





まあ、そのような「クラス」を使用した結果

画像

私たちが何を扱っているのかすぐにわかります。



例2.セッションを操作します。


セッションをできる限りシンプルにする必要があります。

私たちのクラス:

 /* @property $var1 string */ /* @property $var2 string */ /* @property $var3 string */ 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)); //$r = new Response($response);   $body = "Data count = ".$r->data->count(); $body.= "\n"; $tags = $r->data; $data = new TagData($r->data->get(0)); $url = $data->images->standard_resolution->url; $body.= $data->id; $body.= "Image0 url: ".$url; $body.= '<img src="'.$url.'">';
      
      





クラスコード:

少しのInstagram API
 /** * Class Response * @package instagram * * @property Meta $meta * @property \ArrayClass $data * @property Pagination $pagination * */ class Response extends \ArrayClass { public function getMeta(){ return new Meta($this->get('meta')); } public function getPagination(){ return new Pagination($this->get('pagination')); } } /** * Class Meta * @package instagram * * @property integer $code */ class Meta extends \ArrayClass { } /** * Class Pagination * @package instagram * * @property integer $next_max_tag_id * @property integer $next_max_id * @property integer $next_min_id * @property string $next_url */ class Pagination extends \ArrayClass { } /** * Class TagsData * @package instagram * * @property $attribution * @property \ArrayClass $tags * @property string $type * @property $location * @property $comments * @property $filter * @property integer $created_time * @property $link * @property $likes * @property Images $images * @property \ArrayClass $users_in_photo * @property Caption $caption * @property boolean $user_has_liked * @property integer $id * @property User $user */ 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 Image * @package instagram * * @property Image $low_resolution * @property Image $thumbnail * @property Image $standard_resolution */ class Images extends \ArrayClass { function __get($name) { return new Image($this->$name); } } /** * Class Image * @package instagram * * @property string $url * @property string $width * @property string $height */ class Image extends \ArrayClass { } /** * Class Caption * @package instagram * * @property integer $created_time * @property string $text * @property User $from * @property int $id * */ class Caption extends \ArrayClass{ public function getFrom(){ return new User($this->get('from')); } } /** * Class From * @package instagram * * @property string $username * @property string $website * @property string $profile_picture * @property integer $id * @property string $full_name * @property string $bio */ class User extends \ArrayClass{ }
      
      









IDEでの表示:

画像



2語で。 Instagramからjsonを取得し、クラスでラップします。 出力では、IDEからクラス構造とヘルプを取得します。



さて、今ArrayClass自体:

 class ArrayClass implements Iterator { private $array; //... /** * @param array|ArrayClass|json_string $array */ function __construct(&$array); // ... public function get($index); // ... public function count(); public function ar(){ return $this->array; } public function json(){ return json_encode($this->array); } }
      
      





完全なArrayClassコード
<?php

 /** * Created by PhpStorm. * User: calc * Date: 02.07.14 * Time: 0:57 */ class ArrayClass implements Iterator { private $array; private $haveNext = false; /** * @param array|ArrayClass $array */ 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; //return isset($this->array[$index]) ? $this->array[$index] : null; } public function count(){ return count($this->array); } public function ar(){ return $this->array; } /** * (PHP 5 >= 5.0.0)<br/> * Return the current element * @link http://php.net/manual/en/iterator.current.php * @return mixed Can return any type. */ public function current() { return current($this->array); } /** * (PHP 5 >= 5.0.0)<br/> * Move forward to next element * @link http://php.net/manual/en/iterator.next.php * @return void Any returned value is ignored. */ public function next() { $this->haveNext = next($this->array); } /** * (PHP 5 >= 5.0.0)<br/> * Return the key of the current element * @link http://php.net/manual/en/iterator.key.php * @return mixed scalar on success, or null on failure. */ public function key() { return key($this->array); } /** * (PHP 5 >= 5.0.0)<br/> * Checks if current position is valid * @link http://php.net/manual/en/iterator.valid.php * @return boolean The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ public function valid() { return $this->haveNext; } /** * (PHP 5 >= 5.0.0)<br/> * Rewind the Iterator to the first element * @link http://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. */ public function rewind() { $this->haveNext = $this->array === array() ? false : true; reset($this->array); } public function json(){ return json_encode($this->array); } }
      
      









配列のラッパーを作成し、このラッパーにいくつかの興味深い機能を提供します。





出力は次のとおりです。

画像



または、子クラスにチェックを追加できます。

プラスは、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(); } }
      
      








All Articles