20190430のPHPに関する記事は11件です。

php-master-changes 2019-04-29

今日はストリームの TLS 1.3 サポートの追加、ビルドシステムのリファクタリング、pdo_mysql のテストの修正、不要コードの削除、typo の修正、CURLFile にストリームのサポートを追加する修正、テストの追加、odbc の不足していた初期化の追加、soap で SEGV が起きる場合がある問題の修正、ドキュメントの更新、imageantialias($image, false) が機能していなかった問題の修正があった!

2019-04-29

codarrenvelvindron: Added tls 1.3 support for PHP

bukka: Fix tests and logic for TLS 1.3

bukka: Enable TLS 1.3 by default

bukka: Update NEWS with added TLS 1.3 info

petk: Automatically remove aclocal.m4 if present

petk: Enhance the buildconf force option

cmb69: Make MySQLPDOTest::extractVersion() more liberal

petk: Remove unused TSRM/readdir.h header

petk: Simplify checking of *nix build tools

cmb69: Fix tests

nikic: Fix typo in TRY_ASSIGN macro name

cmb69: Extend CURLFile to support streams

lcjury: Adds json_encode test for unpacked arrays

staabm: fixed typo

cmb69: Properly initialize out parameter

nikic: Fixed bug #77945

hughmcmaster: Always use pkg-config from the host architecture

hughmcmaster: Use PKG_CHECK_MODULES to detect the libsodium library

hughmcmaster: Use PKG_CHECK_MODULES to detect the zip library

nikic: Add UPGRADING entries

cmb69: Fix #77943: imageantialias($image, false); does not work

cmb69: Add tests for bug77943

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP初心者向け】オブジェクト指向について解説!

はじめに

  • オブジェクト指向について調べて理解したことをまとめました。(一旦、理解したところまで書いたので随時更新していく予定です)

オブジェクト指向とは

  • プログラムを機能ごとにまとめて作成していく設計手法です。

(例)ECサイトの場合

  • 例えば、ECサイトの場合、「会員登録機能」「ログイン・ログアウト機能」「商品登録機能」「商品一覧表示機能」など様々な機能があります。
  • これらを機能ごとに分けてプログラムを作成することがオブジェクト指向です。

オブジェクト指向のメリット

  • 機能の追加や修正が簡単にできる

    • 後から機能を追加する時に、その部分だけ修正すれば良いので簡単です。
  • 情報の管理や内容が特定しやすい

    • 機能ごとにプログラムが書かれているので、どこのプログラムに何が書かれているのかが、誰が見てもわかりやすくなります。

オブジェクト指向の専門用語について

  • オブジェクト指向には専門用語がいくつかあるので紹介していきます。

オブジェクトとは

  • オブジェクトは次で説明するクラス(設計図)を元に作られる物体です。

クラスとは

  • オブジェクトの設計図。
  • 機能に関する変数(プロパティ)と関数(メソッド)をまとめたもの。テンプレート(雛形)のようなイメージ。
  • クラスを元にオブジェクトを作っていきます。

クラスの書き方

  • クラスは「class クラス名」と定義する。
  • クラス名は大文字で始めます。
<?php
  class Products{
   //ここに処理が入ります
  }
?>

インスタンスとは

  • クラス(設計図)をもとに実体化されたものをインスタンスと言います。(実体化されたものをインスタンスやオブジェクトと呼びます)
  • インスタンスは「new クラス名()」で生成できます。

インスタンスの書き方

<?php
class Products{

}

$product = new Products();
?>

プロパティとは

  • オブジェクトが持つ変数(データ)のことです。
  • クラスで定義された変数のことを「プロパティ」と言います。

プロパティの書き方

  • プロパティは「public $プロパティ名」で定義します。
<?php
class Products{
    public $name;

}

$product = new Products();
?>

プロパティの呼び出し方

  • 「インスタンス->プロパティ名」で、そのインスタンスが持つプロパティを呼び出すことができます。
  • クラスに定義されている値を取り出すようなイメージです。
<?php

class Products{
    public $name;

}

$product = new Products();
$product->name = "パソコン";

echo $product->name;

メソッドとは

  • インスタンスが持つ関数のことです。
  • クラスで定義された関数を「メソッド」と言います。

メソッドの書き方

  • メソッドは「public function メソッド名()」のように定義します。
  • 「インスタンス->メソッド名()」でメソッドを呼び出します。
<?php

class Products{
    public $name;
    public function sayProduct(){
        echo "商品:" . $this->name;
    }
}

$product = new Products();
$product->name = "パソコン";
$product->sayProduct();

?>

アロー演算子「->」とは

  • 「->」の記号のことをアロー演算子と言います。
  • 「インスタンス->プロパティ名」「インスタンス->メソッド名()」のように定義します。
  • 左辺にはインスタンスを指定します。右辺には左辺のインスタンスが持つプロパティやメソッドを指定します。そうすることで、そのクラスが持つプロパティやメソッドを呼び出すことができます。

$thisとは

  • クラス内のプロパティを呼び出したい時に「$this」を使います。
  • 「このクラス内の」という意味になります。
  • 「$this」はクラス内の定義したメソッドの中でのみ使用できます。

$thisの書き方

class クラス名{

  public $変数名;

  public function メソッド名(){
    echo this->$変数名;
  }
}

コード例

<?php

class Products{
    public $name = "パソコン";
    public function getName(){
        echo $this->name;
    }
}

$product = new Products();
$product->getName();
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP初心者向け】オブジェクト指向の専門用語について解説!

オブジェクト指向とは

  • プログラムを機能ごとにまとめて作成していく設計手法です。

(例)ECサイトの場合

  • 例えば、ECサイトの場合、「会員登録機能」「ログイン・ログアウト機能」「商品登録機能」「商品一覧表示機能」など様々な機能があります。
  • これらを機能ごとに分けてプログラムを作成することがオブジェクト指向です。

オブジェクト指向のメリット

  • 機能の追加や修正が簡単にできる

    • 後から機能を追加する時に、その部分だけ修正すれば良いので簡単です。
  • 情報の管理や内容が特定しやすい

    • 機能ごとにプログラムが書かれているので、どこのプログラムに何が書かれているのかが、誰が見てもわかりやすくなります。

オブジェクト指向の専門用語について

  • オブジェクト指向には専門用語がいくつかあるので紹介していきます。

オブジェクトとは

  • オブジェクトは次で説明するクラス(設計図)を元に作られる物体です。

クラスとは

  • オブジェクトの設計図。
  • 機能に関する変数(プロパティ)と関数(メソッド)をまとめたもの。テンプレート(雛形)のようなイメージ。
  • クラスを元にオブジェクトを作っていきます。

クラスの書き方

  • クラスは「class クラス名」と定義する。
  • クラス名は大文字で始めます。
<?php
  class Products{
   //ここに処理が入ります
  }
?>

インスタンスとは

  • クラス(設計図)をもとに実体化されたものをインスタンスと言います。(実体化されたものをインスタンスやオブジェクトと呼びます)
  • インスタンスは「new クラス名()」で生成できます。

インスタンスの書き方

<?php
class Products{

}

$product = new Products();
?>

プロパティとは

  • オブジェクトが持つ変数(データ)のことです。
  • クラスで定義された変数のことを「プロパティ」と言います。

プロパティの書き方

  • プロパティは「public $プロパティ名」で定義します。
<?php
class Products{
    public $name;

}

$product = new Products();
?>

プロパティの呼び出し方

  • 「インスタンス->プロパティ名」で、そのインスタンスが持つプロパティを呼び出すことができます。
  • クラスに定義されている値を取り出すようなイメージです。
<?php

class Products{
    public $name;

}

$product = new Products();
$product->name = "パソコン";

echo $product->name;

メソッドとは

  • インスタンスが持つ関数のことです。
  • クラスで定義された関数を「メソッド」と言います。

メソッドの書き方

  • メソッドは「public function メソッド名()」のように定義します。
  • 「インスタンス->メソッド名()」でメソッドを呼び出します。
<?php

class Products{
    public $name;
    public function sayProduct(){
        echo "商品:" . $this->name;
    }
}

$product = new Products();
$product->name = "パソコン";
$product->sayProduct();

?>

アロー演算子「->」とは

  • 「->」の記号のことをアロー演算子と言います。
  • 「インスタンス->プロパティ名」「インスタンス->メソッド名()」のように定義します。
  • 左辺にはインスタンスを指定します。右辺には左辺のインスタンスが持つプロパティやメソッドを指定します。そうすることで、そのクラスが持つプロパティやメソッドを呼び出すことができます。

$thisとは

  • クラス内のプロパティを呼び出したい時に「$this」を使います。
  • 「このクラス内の」という意味になります。
  • 「$this」はクラス内の定義したメソッドの中でのみ使用できます。

$thisの書き方

class クラス名{

  public $変数名;

  public function メソッド名(){
    echo this->$変数名;
  }
}

コード例

<?php

class Products{
    public $name = "パソコン";
    public function getName(){
        echo $this->name;
    }
}

$product = new Products();
$product->getName();
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel初心者】Laravelのプロジェクトを本番環境リリース時にしたこと

前提とする環境

ubuntu  18.04
php     7.2
Laravel 5.8
mysql   5.7.25
apache  2.4.29

本番環境ですること

サーバー自体の基本設定(言語・時間設定等)は完了している前提で、自分がLaravelのプロジェクトをローカル環境と同様に動かすために必要だったことは以下になります。

  1. 各ミドルウェアの設定
  2. .envの作成
  3. vendor配下のインストール
  4. DB設定
  5. laravelプロジェクト内の権限の追加

各ミドルウェアの設定

ApacheやMySQLなどプロジェクトに必要な設定は当然する必要があります。
この部分は本記事では詳細割愛しますが、以前書いた記事で説明していますのでそちらを参照ください。
【入門】ubuntu18.04にLaravel5.8のプロジェクト作成する手順

.envの作成

.envは各環境に依存する設定を記述するファイルです。
laravelプロジェクトにおいてはデフォルトで.gitignoreに登録されているため、新しい環境にプロジェクトを持っていったら毎回作成する必要があります。

プロジェクト直下に置いてある.env.exampleをコピーして、.envを作成するのがおすすめです。
例えばlaravel+mysqlのシンプル構成なら、下記のように変更しておけば問題ないでしょう。

.envの例
APP_NAME=example 自分のプロジェクト名を入れましょう
APP_ENV=production 本番環境ならproductionに変更しましょう
APP_KEY= 後ほど説明します
APP_DEBUG=false 本番環境ならfalseにしましょう trueだと画面上にエラーが表示されます
APP_URL=http://hogehoge.com URLを入れましょう

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1 DBサーバーが別れている場合はDBサーバーのIPを入れましょう
DB_PORT=3306
DB_DATABASE=hoge このプロジェクトでアクセスするデータベースです
DB_USERNAME=fugauser このプロジェクトのDBアクセスで使うユーザーです
DB_PASSWORD=passwordhoge このプロジェクトのDBアクセスで使うパスワードです

composerでlaravelプロジェクトを直接作成した場合はAPP_KEYは最初から作成されているのですが、.env.exampleからコピーして手動で作成した場合は、以下のコマンドでアプリケーションキーを作成します。コマンド実行が完了すれば自動的に.envにキーが入力されます。

コマンドラインでartisanを実行する
php artisan key:generate

vendor配下のインストール

.envと同様に.gitignoreに設定されているため、vendorディレクトリ(laravel本体が置いてある)もインストールする必要があります。
以下のコマンドを実行すればvendor以下にlaravelがインストールされます。

composer install

DB設定

他のサイトなどをみた限りでは、データベース作成などの必要はなさそうですが、自分の場合マイグレーション実行とは別にデータベース作成が必要でした。結果的に行ったこと一覧は以下になります。

  • ユーザー作成
  • データベース作成
  • マイグレーション実行(php artisan migrate)

laravelプロジェクト内の権限の追加

自分の場合Laravelプロジェクトで何箇所か権限がないためFatal errorが出ました。
以下のページを参考に、いくつかディレクトリに権限を付与することでエラーが解消されました。

参照:Linuxコマンドのお勉強 再帰的にパーミッションを変更

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TwitterAPI で、OAuth認証の署名を作成する際に使用するURLに ? を付けるとエラーになる

エラーの内容

code : 32
message : Could not authenticate you.

エラーの原因,解決策

とても単純で、OAuth認証の署名を作成する際に使用するURLの末尾に ? が付いていることが原因です。
クエリを付ける場合は、署名を作成した後にURLの末尾に ? を付けましょう。

環境

PHP
Twitter API

上記のようなエラーが発生してしまうケース

下記のコードは署名部分の詳細なコードは省いてます。

example_failure.php
// APIのリクエスト先URL
// ? を付けてしまうとエラーとなってしまいます
$request_url = 'https://api.twitter.com/1.1/users/show.json?' ;

/* OAuthの署名作成処理部分 */

// クエリとしてAPIへ送信するパラメータ
$params_a = array(
    "screen_name" => $twitter_id,
    "include_entities" => "false",
) ;

// パラメータがある場合、URLの末尾に追加
if( $params_a ) {
    $request_url .= http_build_query( $params_a ) ;
}

動作する例を以下に示します。

example_success.php
// APIのリクエスト先URL
// ? はここで付けない
$request_url = 'https://api.twitter.com/1.1/users/show.json' ;

/* OAuthの署名作成処理部分 */

// クエリとしてAPIへ送信するパラメータ
$params_a = array(
    "screen_name" => $twitter_id,
    "include_entities" => "false",
) ;

// パラメータがある場合、URLの末尾に追加
if( $params_a ) {
//  ここで ? を付ける
    $request_url .= '?' . http_build_query( $params_a ) ;
}

とても単純なミスですが、エラーメッセージから原因を推測することが難しいですね・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでjson形式の設定ファイルを設置する

概要

Laravelでjson形式の設定ファイルを設置する最適な場所を探した結果こうなった、という紹介です。

要件

  • 関数などを使って簡単に設定にアクセスできる
  • 設定ファイルなので、ファイル自体の削除・書き込みがされない

結果的に、configにはjsonファイルを読み出す処理を書いて、別の場所にjsonファイルを設置しています。

これがベストな方法かはわかりませんが、以下の難点を避けて、要件を満たすことはできています。もっといい方法知ってるという方は、ご教示お願いします。

注:こうはしなかったという選択肢

configをjsonで書いておきたいっていうのはよくあると思うのですが、Laravelではヘルパー関数のconfig()で読み出せるのはPHP配列なので、単純にconfig以下にjsonファイルをおいてもうまく動作しません。

また、storageに設置して読み出すという方法もあり、ライブラリ( https://github.com/labkod/laravel-config )が作られたりしてしますが、storage以下のファイルはアプリケーション上から、編集・削除できるので設定ファイルを置きたくないです。(Storage::delete()とか)

解決法概要

  • config/json/以下にjsonファイルを設置
  • config/myconfig.json.phpを作成
  • 設定ファイルをリポジトリ管理したくない場合
    • .gitignoreに追記
    • config/json/myconfig.json.exampleを作成

解決法詳細

jsonファイル設置

$ mkdir config/json
$ mv /path/to/json/file config/json/myconfig.json

config/myconfig.json.phpを作成

condigファイルでjsonファイルを読みだし、デコードする処理を書きます。

config/myconfig.json.php
<?php
return json_decode(file_get_contents(__DIR__ . '/json/myconfig.json'), true);

以上の設定で、Laravelのヘルパー関数configを使って、設定の読み出しができます。ドット記法も使えちゃいます。

app/any_laravel_file.php
$config = config('myconfig.json');

設定ファイルをリポジトリ管理したくない場合

configには秘匿したい情報もあったりすると思うので、その場合は以下の手順でgit管理から外しておくといいと思います。

.gitignoreに追記

.gitignore
config/json/*.json

config/json/myconfig.json.exampleを作成

$ cp config/json/myconfig.json config/json/myconfig.json.example

秘匿したい情報を削除。
exampleファイルのみをgit管理すればOKでしょう。

課題

とりあえず、一つの設定ファイルにはこれで対応できます。
この後運用した結果、設定ファイルを置き忘れるなどの管理面での問題が出てくるかもしれませんが、その際はまた考えます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

4/30 PHP 組込関数について

組込関数について

PHPの関数の違い

・組込関数
 PHPにあらかじめ設定されている関数
・d独自関数
 開発者が設定した関数

<?php
//関数の前にはfunctionをつける
function outputName()
{
$name = “山田”;
echo 私の名前は . $name . です。;
}
//関数呼び出し文
outputName( );
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

4/30 PHP 関数について

組込関数について

PHPの関数の違い

・組込関数
 PHPにあらかじめ設定されている関数
・d独自関数
 開発者が設定した関数

<?php
//関数の前にはfunctionをつける
function outputName()
{
$name = 山田;
echo 私の名前は . $name . です;
}
//関数呼び出し文
outputName( );
?>

独自関数について

<?php
function say_hello($name = "Suzuki") {
    echo "Hello! ".$name;
}
say_hello();
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

4/30 foreach構文

foreach構文

 配列の中から要素を取り出してループ処理を行う
 構文

<?php
//りんご…を代入
$number_array =["りんご", "ぶどう", "もも", "パイナップル"];

//valueに向けて中身を取り出す
foreach ($number_array as $value) 

{
echo $value.PHP_EOL;
}
?>

keyとvalueを別々に取り出す

<?php
$associative_array = [
    "name"    => "山本",

    "age"     => 23,

    "from"    => "東京都",

    "gender"  => "male"
];
foreach ($associative_array as $key => $value) {
    echo $key.PHP_EOL.":";
    echo $value.PHP_EOL;
}
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

4/30 PHP自習 for構文

for構文

ループ処理に関する制御構文

・$i = 1   一番最初に実行される

・$i<=100 ループに際に実行される。真の場合のみループ処理

・ $i++    各ループの最後に実行される式です

<?php
for ($i = 1; $i <= 100; $i++)
{
    $sum += $i;
    echo $sum.PHP_EOL;
}
?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP マイクロフレームワーク Slim v4 のアルファ版が出ました!

実装の薄さで言えばトップクラスの PHP マイクロフレームワーク Slim Framework の最新メジャーバージョン、 v4 のアルファ版がリリースされていました。

v4 の作成中ドキュメントは現在こちらで閲覧出来ます(リリース後は URL 変わりそう)。

リリースノートはこちらで、フィードバックはこちらで受け付けているようです。

※ Slim Framework 自体についての紹介は省略します。

v3 からどう変わった?

PSR 準拠を進めた

PSR-7: HTTP Message Interface

PHP のスタンダードなインターフェース(なお Symfony/Laravel 系列を除く)として存在する PSR 準拠をデザインの主軸に置いている Slim ですが、 v3 では PSR-7 である HTTP Message 部分を自前で実装して提供していました。

v4 からはその実装も slim/psr7 の方に移動していて、ユ-ザが任意の PSR-7 実装を選択して使えるようになっています。

現在は公式として Slim PSR-7, Nyholm PSR-7, Guzzle PSR-7, Zend Diactoros の四種類がサポートされています。インターフェースを実装することでその他の PSR-7 実装を利用することも可能です。

公式でサポートされている実装は, require するだけで自動的に存在するかどうかを判別してくれます。

PSR-11: Container Interface

PSR-11 ContainerPimple がデフォルトでインストールされていました。

Pimple もまたマイクロな DI コンテナとなっていて、本当に「手動で登録して」「手動で取得する」しか出来ないシンプルなものでした。コンストラクタに型を記述しておけば自動で依存関係を解決してインスタンス化出来る AutoWiring 機能を持っているのが一般的な DI コンテナです。

この Pimple も依存関係から外れて、 DI コンテナ実装を自由に選べるようになりました。

PSR-15: HTTP Handlers

最もメインで破壊的な変更として、 PSR-15 HTTP Handlers による HTTP ハンドリングを行う形式になったことが挙げられます。

PSR-15 を最速で実装して話題になったのは Zend Expressive ですが、それに追従する形となります。

これは PSR-7 の Request を受け取って、 Middleware を経由し、 Response を生成する、という一連の流れを定義したインターフェースです。

Slim\App メインクラスがこの RequestHandlerInterface を実装したものとなっています。

PSR-17: HTTP Factories

PSR-7 の Request や Response クラスをどう生成するのか定義した PSR-17 HTTP Factories も利用されています。

ルーティングの実装依存を弱めた

これまで通り nikic/fast-route を依存として明示されていて、これを利用したルーティングを実装していますが、インターフェ-スを経由してユーザが異なるルーティングライブラリを使うことも出来るようになりました。いよいよ何を実装しているのかわからないレベルです。

エラーハンドリングを実装しやすくした

v3 で任意のエラーハンドリングを行う際は、コンテナの errorHandler キ-に関数を登録する形で、 403/404/PHP Error は別のキ-に登録する必要があるなどかなり分かりづらい形式でしたが、今回から ErrorMiddleware が実装され、ミドルウェアを通してハンドリングを調整出来るようになりました。

また、例外が SlimException ではなく HttpException となり、各種ステ-タスコ-ドごとのクラスに分けられたので、型を見て処理を分けることができるようになりまし。

レスポンスの Emit をカスタマイズしやすくした

v3 では Slim\App クラス内でレスポンスを出力していましたが、任意の実装で出力出来るよう Slim\EventEmitter クラスに分割されました。

連想配列によるコンフィグをやめた

以前は謎の連想配列をコンフィグとして Slim\App クラスのコンストラクタに渡し挙動を変更していましたが、代わりにそれぞれの設定を複数の Middleware クラスのコンストラクタで明示的に指定するようになりました(エラ-を表示するかどうかなど)。


根本的に、 Slim は HTTP リクエストを受け取り、適切なコールバックルーチンを実行し、 HTTP レスポンスを返すだけの Dispatcher である

Slim のコアコンセプトとしてこのようなものが挙げられています。 PHP 利用者は HTTP プロトコルの処理を($_GET などを通して...)したいわけではなく、受け取ったリクエストを処理してレスポンスを生成したいだけです。

PHP 特有の HTTP プロトコル周りの難しい処理を Slim が全て行ってくれるので、 Slim の利用者は 実装したい処理だけ を実装することができます。

個人的にはかなり,かなり良くなったと思います。

v3 までの実装だと,「小規模な実装であれば使えそうだけど,スケールしづらいなあ...」と思っていましたが,ここまで抽象化が進んでいれば 大規模な所までスケールして いけるのではないかという期待があります。

DDD によるサンプル実装として l0gicgate/Slim-Skeleton が提供されています。これをみるとスケールも全然出来そうな可能性を感じます。


代わりに、 v3 との変更がかなり大きいため,バージョンアップはかなり厳しいのではないでしょうか。 v3 を使っている人はそのまま,これから新しくアプリケーションを構築する人は v4 を使っていくのが良いのではないでしょうか。これからの動向が楽しみですー。

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む