PHP | POPWEB https://blog.popweb.dev Developer, Blogger, Illustrator in Tokyo. Sun, 14 Nov 2021 01:08:27 +0000 ja hourly 1 https://wordpress.org/?v=6.7.6 https://storage.googleapis.com/gcs.pop-web.net/2021/01/favicon.ico PHP | POPWEB https://blog.popweb.dev 32 32 【初心者向け解説】PHPのクラス、抽象クラス、インターフェース、トレイトについて https://blog.popweb.dev/programming/php/php-object-orientation/ https://blog.popweb.dev/programming/php/php-object-orientation/#respond Wed, 02 Dec 2020 12:13:00 +0000 https://blog.popweb.dev/?p=1478 まず、オブジェクト指向とはなにかについて説明。 オブジェクト指向は、ざっくりいうと役割をクラスごとに分けてそれを組み合わせながらプログラミングを行っていくこと。 クラスは、変数、定数、関数を一つにまとめたものである。 オ […]

The post 【初心者向け解説】PHPのクラス、抽象クラス、インターフェース、トレイトについて first appeared on POPWEB.]]>
まず、オブジェクト指向とはなにかについて説明。

オブジェクト指向は、ざっくりいうと役割をクラスごとに分けてそれを組み合わせながらプログラミングを行っていくこと。

クラスは、変数、定数、関数を一つにまとめたものである。

オブジェクト指向の3つの要素として以下があげられる。

  • クラス継承
  • カプセル化
  • ポリモーフィズム(多様性)

クラスの種類には、クラス、抽象クラス、インターフェース、トレイトというものがある。

それぞれ使い方や特徴は以下の通り。

クラスの種類宣言方法使用方法特徴
クラスclassextends一般的なクラス
抽象クラスabstract classextends継承専用のクラス
インターフェースinterfaceimplementsメソッドのみ
トレイトtraituseuseで複数継承できる

クラスとインスタンスについて

まず、クラスからインスタンスを作るという基本的なやり方から。

<?php

class Human
{
    private $name = [];

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

    public function getName()
    {
        echo $this->name;
    }

    public static $friendName = '鈴木くん';
}

$instance = new Human('山田くん');

$instance->getName(); // 山田くん

echo Human::$friendName; // 鈴木くん

Humanクラスから、newを使ってインスタンスを生成する。

__constructは、インスタンスを生成するときに呼び出される初期化処理を書くことができる。

ここでは、インスタンス生成時に渡した値(’山田くん’)が、Humanクラスの$name変数に入る。

そして、インスタンス化されたオブジェクトである$intanceの関数であるgetNameで値を表示している。

また、staticを使用することで、インスタンスを生成せずに、静的にプロパティやメソッドを呼び出すこともできる。

呼び出し方は、24行目のように「クラス名::メソッド名」または、「クラス名::プロパティ名」という感じ。

クラスの継承

クラスの継承はextendを使って行う。

<?php

class BaseHuman
{
    public function echoFunction()
    {
        echo 'BaseHumanのメソッドです。';
    }
}

class Human extends BaseHuman
{
    private $name = [];

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

    public function getName()
    {
        echo $this->name;
    }
}

$instance = new Human('山田くん');

$instance->echoFunction(); // BaseHumanのメソッドです。

BaseHumanというクラスを作成して、Humanクラスで継承する。

そうすると、Humanクラスのインスタンス化したオブジェクトでBaseHumaクラスのメソッドを呼び出すことができる。

継承元と同じメソッドを定義することで上書き(オーバーライド)することができる。

<?php

class BaseHuman
{
    public function echoFunction()
    {
        echo 'BaseHumanのメソッドです。';
    }
}

class Human extends BaseHuman
{
    private $name = [];

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

    public function getName()
    {
        echo $this->name;
    }

    // 上書きオーバーライド
    public function echoFunction()
    {
        echo 'Humanのメソッドです。';
    }
}

$instance = new Human('山田くん');

$instance->echoFunction(); // Humanのメソッドです。

上記では、BaseHumanのメソッドであるechoFunction()を上書きしている。

補足:アクセス修飾子について

クラス内で使用する変数や関数にアクセス修飾子とつけて、どこからアクセスできるかを指定することができる。

アクセス修飾子説明
privateクラス外がアクセスできない、自分のクラスからのみアクセスできる
protected自分のクラスか、継承したクラスからアクセスできる
publicクラス外でも自分のクラスからでもアクセスできる

抽象クラスのついて

抽象クラスは継承される前提のクラスで、継承先で設定するメソッドやプロパティを強制する役割を持つ。

抽象クラスにはclassの前にabstractを付ける。そして、抽象化したいメソッドの前にもabstractを付けることで継承先で強制ができる。

この時、abstractを付けて、abstractメソッドにするとメソッドの中身は書けないことになっている。

abstractメソッドと普通のpublicメソッドも混在して定義することもできる。

継承するにはextendを用いる。

<?php

// 抽象クラス
abstract class humanAbstract
{
    public function echoFunction(){
        echo '抽象クラスのメソッドです。';
    }
    abstract public function getName();
}

// 具象クラス
class Human extends humanAbstract
{
    private $name = [];

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

    public function getName() // 抽象クラスでabstract設定したため必ず必要なメソッド
    {
        echo $this->name;
    }
}

インターフェースについて

インターフェースと抽象クラスの違いは、すべて強制するメソッドしか描けないこと。

定義する場合は、先頭にinterfaceとして、使用する場合はimplementsを使う。

抽象クラスの場合、1つの抽象クラスしか継承できないが、インターフェースは複数適用することが可能。

<?php

// インターフェース
interface humanInterface
{
    public function getName();
}

// インターフェース
interface foodInterface
{
    public function getFood();
}

// 具象クラス
class Human implements humanInterface,foodInterface
{
    private $name = [];

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

    public function getName() // 抽象クラスでabstract設定したため必ず必要なメソッド
    {
        echo $this->name;
    }
    public function getFood()
    {
        echo '食べ物です';
    }
}

$instance = new Human('山田くん');
$instance->getName(); // 山田くん
$instance->getFood(); // 食べ物です

トレイトについて

先頭にtraitとつけてclassと同じように定義していく。

使いたいclassの中にuseを使うことでtraitの内容を反映することができる。

traitも複数呼び出すことが可能で、上書き(オーバーライド)もできる。

<?php

trait HumanTrait
{
    public function getName(){
        echo '名前です';
    }
}

trait FoodTrait
{
    public function getFood(){
        echo '食べ物です';
    }
}

class Human{
    use HumanTrait;
    use FoodTrait;
    public function echoFunction()
    {
        echo 'Humanクラスです';
    }
}

$instance = new Human();

$instance->echoFunction(); // Humanクラスです
$instance->getName(); // 名前です
$instance->getFood(); // 食べ物です

以上、クラス、抽象クラス、インターフェース、トレイトの説明終わり。

The post 【初心者向け解説】PHPのクラス、抽象クラス、インターフェース、トレイトについて first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/php/php-object-orientation/feed/ 0
【エラー解決】PHP: syntax error, unexpected BOOL_FALSE in /etc/php.ini https://blog.popweb.dev/programming/php/php-syntax-error-unexpected-bool-false-in-etc-php-ini/ https://blog.popweb.dev/programming/php/php-syntax-error-unexpected-bool-false-in-etc-php-ini/#respond Sun, 14 Jun 2020 14:11:00 +0000 https://blog.pop-web.net/?p=1345 さくらのVPSにPHP7.4をインストールして使用しているが、PHPを実行するたびに以下のようなエラーを吐いていた。 実際にphp.iniファイルの1008行目のぞいてみると、コメントアウトされている箇所で、エラーが出る […]

The post 【エラー解決】PHP: syntax error, unexpected BOOL_FALSE in /etc/php.ini first appeared on POPWEB.]]>
さくらのVPSにPHP7.4をインストールして使用しているが、PHPを実行するたびに以下のようなエラーを吐いていた。

php -v
PHP:  syntax error, unexpected BOOL_FALSE in /etc/php.ini on line 1008

実際にphp.iniファイルの1008行目のぞいてみると、コメントアウトされている箇所で、エラーが出るような設定はなかった。

    106 ; error_reporting
    107 ;   Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    108 ;   Development Value: E_ALL
    109 ;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT

調べてみると、エラーで示されている行番号でエラーが出ているわけではなかった。

それより以前の行でシンタックスエラーでているらしい。

今回の場合、923行目のタイムゾーンのダブルクォートが抜けている箇所がエラーだった。

    920 [Date]
    921 ; Defines the default timezone used by the date functions
    922 ; http://php.net/date.timezone
    923 date.timezone = Asia/Tokyo"

ダブルクォートを付け加えて修正保存。

    923 date.timezone = "Asia/Tokyo"

最後に修正を有効にするため、再起動させておく。

systemctl restart php-fpm
systemctl restart nginx
The post 【エラー解決】PHP: syntax error, unexpected BOOL_FALSE in /etc/php.ini first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/php/php-syntax-error-unexpected-bool-false-in-etc-php-ini/feed/ 0
FTPログイン接続をSlackで自動通知するツールの作成 https://blog.popweb.dev/programming/php/ftp-auto-check/ https://blog.popweb.dev/programming/php/ftp-auto-check/#respond Mon, 22 Jul 2019 14:29:55 +0000 https://blog.pop-web.net/?p=329 複数のFTPログイン情報の記載があるcsvファイルを参照し、ログイン接続できるかの自動チェックツールを作成しました。 通知はSlackへ通知するようにしました。 定期的にチェックしたいので、cronにセッティングしました […]

The post FTPログイン接続をSlackで自動通知するツールの作成 first appeared on POPWEB.]]>
複数のFTPログイン情報の記載があるcsvファイルを参照し、ログイン接続できるかの自動チェックツールを作成しました。

通知はSlackへ通知するようにしました。

定期的にチェックしたいので、cronにセッティングしました。

Slack通知には、APIの「Webhook URL」が必要なので事前に取得しておきます。

実際に作ったスクリプトは以下になります。

<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
date_default_timezone_set('Asia/Tokyo');

//接続情報を配列形式に
$connect_array = [];
$csv = file('/usr/local/bin/ftplist.csv');//FTPログインユーザーのリストファイル
foreach ($csv as $row) {
    $row = str_replace(array("\r\n", "\r", "\n"), '', $row);//改行の削除
    $row_array = explode(',', $row);
    array_push($connect_array,$row_array);
}

foreach($connect_array as $connect){
    // 設定
    $user = $connect[0];//ユーザー名
    $pass = $connect[1];//パスワード
    $host = "192.168.33.10";//接続先サーバー
    $port = 21;//Port

    // FTPサーバ接続
    $conn_id = ftp_connect($host,$port);

    // ログインを試みる
    if (!@ftp_login($conn_id, $user, $pass)) {
        $message = "ログインエラー". PHP_EOL . 
        "以下のユーザーでログインができませんでした。" . PHP_EOL . 
        "$user@$host" . "(" . gethostname() . ")" . PHP_EOL  .
        date("Y/m/d H:i:s") . PHP_EOL;

        // slackへ送信
        slack($message);
    }

    // 接続を閉じる
    @ftp_close($conn_id); 
}

// slack通知
function slack($message) {
    $icon_emoji = ":warning:";
    $data = "payload=" . json_encode(
        array(
            "text" => $icon_emoji . $message,
        )
    );
    $ch = curl_init("SlackのWebhook URL");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
?>
The post FTPログイン接続をSlackで自動通知するツールの作成 first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/php/ftp-auto-check/feed/ 0
Call to undefined function ssh2_connect()のエラー。ssh2インストールするまでの手順 https://blog.popweb.dev/programming/php/call-to-undefined-function-ssh2-connect/ https://blog.popweb.dev/programming/php/call-to-undefined-function-ssh2-connect/#respond Fri, 19 Jul 2019 16:33:15 +0000 https://blog.pop-web.net/?p=305 PHPでssh2_connect()を使用したら、上記のエラーがでたのでssh2インストール手順をメモる。 環境としては、VagrantでCentOSを入れて、PHP5.4をインストール。 そもそも、ssh2インストール […]

The post Call to undefined function ssh2_connect()のエラー。ssh2インストールするまでの手順 first appeared on POPWEB.]]>
Call to undefined function ssh2_connect()

PHPでssh2_connect()を使用したら、上記のエラーがでたのでssh2インストール手順をメモる。

環境としては、VagrantでCentOSを入れて、PHP5.4をインストール。

そもそも、ssh2インストールするには、

peclコマンドでssh2をインストールする必要がある。

peclのインストール

peclを導入するために、Pearが必要

sudo yum install php54w-pear

しかし、上記コマンドでいれようとするとエラー

sudo yum install -y --enablerepo=remi,remi-php54 php-pear

これで対応。

peclが使用できることを確認します。

pecl

ssh2をインストール

必要なものをインストール

sudo yum -y install libssh2 libssh2-devel

これで、やっとssh2をインストールできる。

sudo pecl install -f ssh2

モジュールが追加されているかを確認

ll /usr/lib64/php/modules/ | grep ssh2
-rw-r--r--. 1 root root  273672 Jul  3 05:48 ssh2.so

php.iniへの追記

最後に、php.iniへ「extension=ssh2.so」を追記(最終行でOK)

参考サイト

The post Call to undefined function ssh2_connect()のエラー。ssh2インストールするまでの手順 first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/php/call-to-undefined-function-ssh2-connect/feed/ 0
PHPでMySQLデータベースへPDO接続方法 https://blog.popweb.dev/programming/php/php-mysql-pdo/ https://blog.popweb.dev/programming/php/php-mysql-pdo/#respond Fri, 31 May 2019 05:03:33 +0000 https://blog.pop-web.net/?p=161 PHPで、PDOクラスを使ってMySQLのデータベースへ接続するときのソースです。

The post PHPでMySQLデータベースへPDO接続方法 first appeared on POPWEB.]]>
PHPで、PDOクラスを使ってMySQLのデータベースへ接続するときのソースです。

<?php
    //DBユーザー名
    $user = "testuser";
    //DBパスワード
    $password = "passwd";
    //利用するデータベース名
    $dbName = "testdb";
    //MySQLサーバ名
    $host = "localhost";
    //MySQLのDNS(Data Source Name)文字列
    $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";

    //MySQLデータベースに接続する
    try{
        $pdo = new PDO($dsn,$user,$password);
        //PDOクラスのエミュレーションを無効にする
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        //例外をスローする設定にする
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "データベース{$dbName}に接続しました。";
    }catch(Exception $e){
        echo "データベース接続エラーです";
        echo $e->getMessage();
        exit();
    }
?>

The post PHPでMySQLデータベースへPDO接続方法 first appeared on POPWEB.]]>
https://blog.popweb.dev/programming/php/php-mysql-pdo/feed/ 0