PHPの正規表現

test.php

$str = "123-4567";
if(preg_match("/^[0-9]{3}-[0-9]{4}$/", $str)){
	echo "マッチします。";
} else {
	echo "マッチしません。";
}

正規表現 半角文字

/^[\x21-\x7e]*$/

うーん 難しいな

composer.jsonのrepositories

	"repositories": {
		"my/repo": {
			"type": "vcs",
			"url": "https://github.com/my/repo"
		}
	}

RepoProject/composer.json

{
	"name": "sample-vendor/ralabel",
	"description": "Composerサンプルプロジェクト",
	"license": "MIT",
	"autoload": {
		"psr-0": {
			"Ralabel\\":"src/"
		}
	}
}

DummyProject/composer.json

{
	"repositories": [
		{
			"type": "vcs",
			"url" : "/home/vagrant/dev/composer/RepoProject/"
		}
	],
	"require": {
		"sample-vendor/ralabel": "dev-master"
	}
}

composer.jsonのscriptsはコマンドだけで実行できる

ライブラリ側でcomposer.jsonを作成して、利用側のcomposer.jsonでrepositoriesで指定してパーツを利用するのか、、
なるほど、repositoriesの使い方を理解した。

composer.jsonの中身

composer.jsonのバージョン指定方法
-dev: 開発中
-rc: 公開前
-stable: 安定版

requireは必ず必要なパッケージ
require-devは開発用だけで必要なパッケージ
本番環境では、composer install -no-devとしてインストール

### オートロード機能
オートロード機能は自動でclass fileを読み込む機能
psr-4: 名前空間とcomposer.jsonの存在するディレクトリからの相対パスの対応付け

	"autoload": {
		"psr-4" : {
			"App\\": "app/"
		}
	}

autoloadセクションを編集した場合、下記コマンドを実行して変更を反映
$ composer dump-autoload

### バージョン指定

	"config": {
		"platform": {
			"php": "5.5.9"
		}
	}

$ php composer.phar suggests
インストールしたパッケージと共に利用すると良い関連パッケージ

repositories: カスタムパッケージのリポジトリを設定
Custom package repositories to use.By default Composer only uses the packagist repository. By specifying repositories you can get packages from elsewhere.
vcs: The version control system repository can fetch packages from git, svn, fossil and hg repositories.

Repositories are not resolved recursively. You can only add them to your main composer.json. Repository declarations of dependencies’ composer.jsons are ignored.
prefer-stable:When this is enabled, Composer will prefer more stable packages over unstable ones when finding compatible stable packages is possible. If you require a dev version or only alphas are available for a package, those will still be selected granted that the minimum-stability allows for it.

repositoriesの箇所はテストする必要がある

composerの使い方

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar –version
Composer version 2.4.1 2022-08-20 11:44:50

### composer.json
composerで管理する依存パッケージを定義するためのファイル

composer.json
L composerで管理する依存パッケージを定義するためのファイル

{
	"require": {
		"ircmaxell/random-lib": "1.0.0"
	}
}

composer.lock
L チーム内で同じバージョンを共有するための仕組み
L composer install でcomposer.lockで記したバージョンのパッケージインストール
L composer update で composer.lockに記されたバージョンを無視して、composer.jsonの最新版に更新

vendor
L composer installでインストールされたプログラムが、composer.jsonと同じ階層になるvendorフォルダ内に配置される

$ php composer.phar install
$ ls
composer.json composer.lock composer.phar vendor
$ ls vendor/
autoload.php composer ircmaxell

require_once "vendor/autoload.php";

$factory = new RandomLib\Factory;

$generator = $factory->getMediumStrengthGenerator();

echo $generator->generateString(32, "abcdef");

$ php index.php
cabdaddbdbdbbdeeffdeaeadffacefed

ここまでは基礎
composer.jsonの中に書かれている各項目が何を意味するか理解する必要がある

PHP checkEmpty, preg_match

private function checkEmpty($key, $message, ErrorCode $errorCode){
	if(self::isEmpty($this->array, $key)){
		throw new InnerException($message, $errorCode);
	}
	return $this->array[$key];
}
if(preg_match("/PHP/", "今PHPを勉強しています。")){
	echo "マッチしました。";
} else {
	echo "マッチしませんでした。";
}

PHP ErrorException

function exceptionErrorHandler($errono, $errstr, $errfile, $errline){
	throw new ErrorException($errstr, $errno, $errfile, $errline);
}
set_error_handler('exceptionErrorHandler');

error_reporting(E_ALL);
try {
	$arr = array();
	print $arr['a'] . "\n";
	strpos();
} catch (Exception $e){
	print $e->getMessage(). "\n";
	print $e->getTraceAsString(). "\n";
}

PHPのインターフェースと抽象クラス、多重継承、トレイト

インターフェースは、そのインスタンスはこのメソッドを持っているという意味

interface hoge {
	public function t1();
}

class foo implements hoge {
	public function t1(){
		echo "foo's t1()\n";
	}
}

$obj = new foo();
$obj->t1();

抽象クラス

abstract class hoge {
	abstract public function t1();
	abstract protected function t2();

	private $i_;
}

class foo extends hoge {
	public function t1(){
		echo "foo's t1()\n";
		$this->t2();
	}
	public function t2(){
		echo "foo's t2()\n";
	}
}

$obj = new foo();
$obj->t1();

PHPのマジックメソッドと無名関数

マジックメソッドはPHP固有に近い
マジックメソッドは、インスタンスがある特定の条件になった時に、明示的にcallしなくても暗黙的にcallされるメソッドの総評
先頭2文字がアンダースコア(__)になっている

### アクセス不能プロパティを読み書きする__get(), __set()

class hoge {
	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;
class hoge {

	public function __get($name){
		echo "get: name is ${name}\n";
		return "dummy";
	}
	public function __set($name, $val){
		echo "set: ${name} <= ${val}\n";
	}

	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;

### __call()と__callStatic()
アクセス不能メソッド

class hoge {
	public function __call($name, $args){
		echo "call {$name}\n";
		var_dump($args);
	}
	public function __callStatic($name, $args){
		echo "callStatic {$name}\n";
		var_dump($args);
	}
}

$obj = new hoge();
$obj->func();
hoge::func_static();

### 無名関数

$func = function(){
	echo "Anonymous function\n";
};

$func();
var_dump($func);
class hoge {
	public function __invoke(){
		echo "call method\n";
	}
}

$obj = new hoge();
$obj();

PHPにおける継承、オーバーライド、protected、parentの書き方

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function B(){
		echo "call B\n";
	}
	private $j_ = 999;
}

$hoge_obj = new hoge();
$hoge_obj->A();
var_dump($hoge_obj);

$foo_obj = new foo();
$foo_obj->B();
$foo_obj->A();
var_dump($foo_obj);

### オーバーライド

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function A(){
		echo "call B\n";
	}
	private $j_ = 999;
}

– protected

class hoge {
	
	private function h_pri_func(){
		echo "call h_pri_func\n";
	}
	protected function h_pro_func(){
		echo "call h_pro_func\n";
	}
}

class foo extends hoge {
	public function f_pri_func(){
		echo "call f_pri_func\n";
	}
	public function test(){
		$this->f_pri_func();
		$this->h_pro_func();
	}
}


$foo_obj = new foo();
$foo_obj->test();

– parent: 継承元のconstructor, destructorを呼ぶ

class foo extends hoge {
	public function __construct(){
		parent::__construct();
		echo "run foo constructor\n";
	}
	public function __destruct(){
		parent::__destruct();
		echo "run foo destructor\n";
	}
}

なるほど、constructorの整理にはなった。

PHPのアクセス修飾子、カプセル化、アクセサー、コンストラクター/デストラクター

### アクセス修飾子 — public, protected, private
public: 外からOK
protected: クラス内、あるいは継承先のクラス内
private: クラス内のみ

class hoge {
	public function pub_func(){
		echo "call pub_func\n";
		$this->pro_func();
		$this->pri_func();
	}

	protected function pro_func(){
		echo "call pro_func\n";
	}

	private function pri_func(){
		echo "call pri_func\n";
	}
}

$obj = new hoge();
$obj->pub_func();
class hoge {
	public $_pub_val;
	protected $_pro_val;
	private $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
var_dump($obj);
class hoge {
	
	public function f(){
		$this->_pro_val = 20;
		$this->_pri_val = 20;
	}
public $_pub_val;
public $_pro_val;
public $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
$obj->f();
var_dump($obj);

隠蔽化とは、全てのプログラム詳細を理解できていなくても、必要な箇所のみ修正•加筆等を行えば、全体として動くことをいう。

### アクセサー(セッター)

class hoge {
	
	public function setVal($v) {
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge();
$obj->setVal('test');
var_dump($obj->getVal());

### コンストラクター

class hoge {
	
	public function __construct(){
		echo "run constructor\n";
	}
}

$obj = new hoge();

run constructor

デストラクター

class hoge {
	
	public function __destruct(){
		echo "run destructor\n";
	}
}

$obj = new hoge();
$obj = null;
sleep(5);

### immutableなオブジェクト

class hoge {
	
	public function __construct($v){
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge('vall');
var_dump($obj->getVal());