メソッドチェーン

メソッドチェーンとは、メソッドをアロー演算子で複数つなぎ、複数のメソッドを一度に行うことです。

サンプルを見てみましょう。

<?php

class Product
{
	private $price = 100;

	public function getPrice()
	{
		return $this->price;
	}
}

class Cart
{
	private $products = array();

	public function add($product)
	{
		$this->products[] = $product;
	}

	public function get($index)
	{
		return $this->products[$index];
	}
}

$cart = new Cart();
$product = new Product();
$cart->add($product);

$prd = $cart->get(0);
$price = $prd->getPrice();

$price = $cart->get(0)->getPrice();

?>
<?php

class Date
{
	private $_timestamp;

	public function __construct()
	{
		$this->_timestamp = time();
	}

	public function addDay($days)
	{
		if (true == preg_match('/^[0-9]+$/', $days)){
			$str = sprintf('+%s day', $days);
			$this->_timstamp = strtotime($str, $this->_timestamp);
		}
	}

	public function format($format)
	{
		return date($format, $this->_timestamp);
	}
}

$date = new Date();
$date->addDay(3);
$fmt = $date->format('Y/m/d H:i');
var_dump($fmt);

?>
<?php

class Chain {
	protected $price;
	protected $quantity;
	protected $option;

	public function setPrice($price){
		$this->price = $price;
		return $this;
	}	

	public function setQuantity($quantity){
		$this->quantity = $quantity;
		return $this;
	}

	public function setOption($option){
		$this->optioin = $option;
		return $this;
	}

	public function get(){
		$amount = $this->price * $this->quantity;
		foreach ($this->option as $key => $val){
			if ($key == 'tax') $amount -= ceil($amount * $val);
			elseif($key == 'discount') $amount -= $val;
		}

		return $amount;
	}
}

$chain = new Chain();
$chain
 ->setPrice(100)
 ->setQuantity(5)
 ->setOption(array(
 	'tax' => '0.05',
 	'discount' => '150'
 	));
 $total_amount = $chain->get();
 echo $total_amount;

?>

array()

配列は複数の値をまとめたもので、データをキー/値のペアにしています。配列には順序があり、要素が追加された順に並んでいます。

<?php

$sushi = array('大トロ', '中とろ', '赤身', 'ネギトロ');

echo $sushi&#91;0&#93;."<br>\n";
echo $sushi[1]."<br>\n";
echo $sushi[2]."<br>\n";
echo $sushi[3]."<br><br>\n";

$chinese = array('peanuts' => '油揚げピーナッツ', 'mushroom' => 'アワビ', 'chicken'=> '鶏肉の激辛ソースがけ');

echo $chinese['peanuts']."<br>\n";
echo $chinese['mushroom']."<br>\n";
echo $chinese['chicken']."<br><br>\n";

$pasta[] = 'クリームフェットチーネ';
$pasta[] = 'ずわい蟹と魚介たっぷりブイヤベース';
$pasta[] = '牡蠣のクリームスープパスタ';

echo $pasta[0]."<br>\n";
echo $pasta[1]."<br>\n";
echo $pasta[2]."<br>\n";

?>

strtotime()

英文形式の日時をUNIXタイムスタンプに変換する
指定された文字列が解釈不能な場合や、タイムスタンプの最大値を超えた場合は-1を返す。

サンプル

<?php

$now = strtotime("now");
$tomorrow = strtotime("tomorrow");

echo '現在時刻:'.date('Y年m月d日 H時i分s秒', $now)."<br>\n";
echo '明日:'.date('Y年m月d日', $tomorrow)."<br>\n";
?>

分かりにくいので、請求書催促の例でみてみましょう。

<?php

$deadline = strtotime("+2 week");

echo "請求書の支払期日を過ぎてもご入金を確認できませんでした。<br>";
echo 'つきましては、二週間後の'.date('Y年m月d日', $deadline)."までにご入金をお願いいたします。";
?>

date関数

-date関数は引数を1つ持てる
-引数1つの時は、現在時刻を指定したフォーマットで出力
-引数2つの時は第二引数のタイムスタンプを指定したフォーマット
-戻り値はstring

サンプル

<?php

date_default_timezone_set('Asia/Tokyo');

echo date("Y/m/d H:i:s") ."<br>";
echo date("Y/m/01") ."<br>";
echo date("Y/m/t")  ."<br>";

$w = date("w");
$week_name = array("日","月","火","水","木","金","土");

echo date("Y/m/d") . "($week_name[$w])\n";
?>

東京、ロンドン、ニューヨークを表示してみましょう。

<?php

date_default_timezone_set('Asia/Tokyo');

$w = date("w");
$week_name = array("日","月","火","水","木","金","土");

echo "東京<br>";
echo date("Y/m/d H:i:s") . "($week_name[$w])<br>";


date_default_timezone_set('Europe/London');
$week_name = array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");

echo "London<br>";
echo date("Y/m/d H:i:s") . "($week_name[$w])<br>";


date_default_timezone_set('America/New_York');

echo "New York<br>";
echo date("Y/m/d H:i:s") . "($week_name[$w])<br>";
?>

住宅ローンの返済月のサンプルです。

<?php

$rate = 0.0135;
$loan = 30000000;
$payment = 85000;
$i = 0;

while($loan > 0){
	$loan = $loan - ($payment - ($loan*$rate / 12));
	$i = $i + 1;
}
$hensai = $i + 1;

date_default_timezone_set('Asia/Tokyo');
echo date("Y/m", strtotime(" + $hensai month"));

?>

Analytics API3

<?php
	
	require_once 'vendor/autoload.php';

	$client_id = 'xxxx';

	$view_id = 'xxxx';

	$private_key = @file_get_contents('xxxx');

	$from = date('2017-12-01', strtotime('-1 day'));
	$to = date('2018-01-31');

	$dimensions = 'ga:pageTitle, ga:pagePath, ga:date';
	$metrics = 'ga:pageviews';

	$option = array(
		'dimensions' => $dimensions,
		'max-results' => 10,
		'sort' => '-ga:pageviews',
		'start-index' => 11,
	);

	if(isset($_SESSION['service_token']))
	{
		$client->setAccessToken($_SESSION['service_token']);
	}

	$scopes = array('https://www.googleapis.com/auth/analytics.readonly');

	$credentials = new Google_Auth_AssertionCredentials($client_id, $scopes, $private_key);

	$client = new Google_Client();
	$client->setAssertionCredentials($credentials);

	if($client->getAuth()->isAccessTokenExpired())
	{
		$client->getAuth()->refreshTokenWithAssertion($credentials);
	}

	$_SESSION['service_token'] = $client->getAccessToken();

	$analytics = new Google_Service_Analytics($client);

	$obj = $analytics->data_ga->get('ga:'. $view_id, $from, $to, $metrics, $option);

	$json = json_encode($obj);

	$html .= '<h2>実行結果</h2>';
	$html .= '<p><b>' .date('Y/m/d', strtotime($from)). '</b>のページビューのデイリーランキングを取得しました。<mark>値はサンプル用のダミーです。</mark></p>';

	if(!isset($obj->rows))
	{
		$html .= '<p><mark>データを取得できませんでした。</mark></p>';
	}
	else
	{
		$html .= '<ol>';

		for($i=0, $l=count($obj->rows); $l > $i ; $i++)
		{
				$item = $obj->rows[$i];
				$html .= '<li><a href="' . $item&#91;l&#93; .'"target="_blank">' .$item[0]. '<a>(' . number_format($item[3]). 'PV)</li>';		
		}
		$html .= '</ol>';
	}

	$html .= '<h2>取得したデータ(JSON)</h2>';
	$html .= '<textarea row="12">' . $json . '</textarea>';

?>

<?php
		echo $html;
?>

file_get_contents()

指定したファイルの内容を全て取得する関数です。

<?php
$contents = file_get_contents('test.txt');
echo $contents;
?>

Analytics API 2

<?php

function getPageView()
{
	require_once 'vendor/autolod.php';

	$viewId = '';
	$client_email = '';
	$private_key = file_get_contents("");

	$metrics = "ga:pageviews";

	$from = '2018-01-30';
	$to = '2018-01-31';

	$option = &#91;
		"dimensions" => 'ga:date',
		"max-results" => 10000,
		"sort" => "ga:date",
	];

	$scope = ["https://www.googleapis.com/auth/analytics.readonly"];

	$credentials = new Google_Auth_AssertionCredentials($client_email, $scopes, $private_key);

	$client = new Google_Client();
	$client->setAssertionCredentials($credentials);

	if ($client->getAuth()->isAccessTokenExpired()){
		$client->getAuth()->refreshTokenWithAssertion($credentials);
	}
	$_SESSION["service_token"] = $client->getAccessToken();

	$analytics = new Google_Service_Analytics($client);

	$obj = $analytics->data_ga->get(
		"ga:{$viewId}",
		$from,
		$to,
		$metrics,
		$option
	);

	echo '<pre>';
	var_dump($obj->rows);
	echo '</pre>';
}

PHP 例外処理

<?php

try {
	throw new Exception('エラーが発生しました');
} catch (Exception $e){
	
}

?>

tryブロック内で例外が発生した場合、catchブロック内で処理、処理終了後、以降へ進む。
tryブロック内で何も起こらなかった場合、catchブロックは無視され、以降の処理へ進む。

サンプル

<?php

class Calc
{
	public static function division($int1, $int2)
	{
		try {
			if ($int2 == 0){
				throw new Exception('0で割ろうとしました<br>');
			}
			$answer = $int1 / $int2;
			echo $answer. "<br>";
			echo '割り算が終了しました<br>';
		} catch (Exception $e){
			echo $e->getMessage();
			echo '割り算が異常終了しました';
		}
	}
}

Calc::division(10, 2);
Calc::division(10, 0);
?>

もう少し分かり易くするため、個人の総量規制で考えてみます。

<?php

class Vcontrol
{
	public static function calc($salary, $loan)
	{
		if($salary > 0){

			try {
			 if ($salary * 1/3 < $loan){
				throw new Exception('借入総額が年収の1/3を超えています。');
			}
				$available = $salary * 1/3 - $loan;
				echo '貸付可能額は' .round($available,1). '万円です。<br>';
			} catch (Exception $e){
				echo $e->getMessage();
				echo '総量規制により貸付できかねます。<br>';
			}
		} else {
			echo '貴殿の年収が足りません。<br>';
		}
		
	}
}

Vcontrol::calc(500, 20);
Vcontrol::calc(300, 200);
Vcontrol::calc(0, 50);
?>

$_SESSION

session_start関数を使って開始し、この下でセッションを保存していくことができる。

サンプル

<?php
session_start();
$_SESSION&#91;'order'&#93;="現物取引:買い注文";
echo $_SESSION&#91;'order'&#93;;
?>

$_SERVER[”] サーバー変数の種類

$_SERVER[‘PHP_SELF’] :ファイル名
$_SERVER[‘GATEWAY_INTERFACE’] :CGIのバージョン
$_SERVER[‘SERVER_ADDR’] :サーバーのIPアドレス
$_SERVER[‘SERVER_NAME’] :サーバーのホスト名
$_SERVER[‘SERVER_SOFTWARE’] :サーバーの認識文字列
$_SERVER[‘SERVER_PROTOCOL’] :プロトコル名とバージョン
$_SERVER[‘REQUEST_METHOD’] :リクエストのメソッド名
$_SERVER[‘REQUEST_TIME’] :リクエスト開始時のタイムスタンプ
$_SERVER[‘QUERY_STRING’] :検索引数
$_SERVER[‘DOCUMENT_ROOT’] :ドキュメントルートディレクトリ
$_SERVER[‘HTTP_ACCEPT’] :現在のリクエストのAccept
$_SERVER[‘HTTP_ACCEPT_CHARSET’] :現在のリクエストのAccept-Charset
$_SERVER[‘HTTP_ACCEPT_ENCODING’] :現在のリクエストにAcept-Encoding
$_SERVER[‘HTTP_ACCEPT_CONNECTION’] :現在のリクエストにConnection
$_SERVER[‘HTTP_HOST’] :現在のリクエストにHost
$_SERVER[‘HTTP_REFERER’] :ユーザーエージェントが参照していたページ
$_SERVER[‘HTTP_USER_AGENT’] :user agent
$_SERVER[‘HTTPS’] :Httpsプロトコルを通じて実行されている場合、空でない値
$_SERVER[‘REMOTE_ADDR’] :ユーザーのIPアドレス
$_SERVER[‘REMOTE_HOST’] :ユーザーのホスト名
$_SERVER[‘REMOTE_PORT’] :ポート番号
$_SERVER[‘SCRIPT_FILENAME’] :スクリプトの絶対パス
$_SERVER[‘SERVER_ADMIN’] :SERVER_ADMINにセットされている値
$_SERVER[‘SERVER_PORT’] :ポート番号
$_SERVER[‘SERVER_SIGNATURE’] :サーバーのバージョンとホスト名
$_SERVER[‘PATH_TRANSLATED’] :ファイルシステム上のパス
$_SERVER[‘SCRIPT_NAME’] :スクリプトのパス
$_SERVER[‘REQUEST_URI’] :ページアクセスするために指定されたURI
$_SERVER[‘PHP_AUTH_DIGEST’] :クライアントから送られたAuthorization
$_SERVER[‘PHP_AUTH_USER’] :ユーザー名
$_SERVER[‘PHP_AUTH_PW’] :ユーザのパスワード
$_SERVER[‘AUTH_TYPE’] :認証形式
$_SERVER[‘PATH_INFO’] :クライアントが提供するパス名
$_SERVER[‘ORIG_PATH_INFO’] :PATH_INFOの原本

関数やメソッドの内部で使用する場合、global $_SERVER;とする必要がありません。

<?php
$sector = '銀行';
$name = '8306';
function code(){
	global $sector, $name;
	echo '業種は' .$sector. 'の' .$name. 'です。<br>'."\n";
}
code();
?>
<?php
$sector = 'IT';

function code(){
	global $sector;
	echo '業種は' .$sector. 'の' .$_SERVER&#91;'HTTP_USER_AGENT'&#93;. 'です。<br>'."\n";
}
code();
?>