20200403のPHPに関する記事は5件です。

スクランブルエッグを作りたい

関数、引数、仮引数、戻り値をスクランブルエッグを作りながら説明する。

はじめに

関数とは、簡単に説明すると、「機能を部品化して再利用できる様にしたもの」です。
同じ様な処理が複数の箇所で必要になる場合があります。
処理が必要になる度に同じ処理を記述していくことは手間が掛かるので、予め機能部品として定義しておくことで、処理を書く回数が1回限りになる上、関数名と引数を記述するだけで利用することが可能になります。

関数を使用して、引数仮引数、戻り値について説明すると、
まず関数を使いたい場合は関数名を記述して呼び出します。
これを呼び出し元と言います。

呼び出し元から関数に引数を渡すと、
引数を処理した後に戻り値として処理結果を呼び出し元に返してくれます。

スクランブルエッグを作ろう!

images.jpeg

例えば、とあるレストランには、卵?(引数)を使ってスクランブルエッグを自動で作れる機械(関数)が置いてあるとします。これはこのレストランが独自で開発(関数の定義)した機械?です。

機械に卵を渡すと、機械は自動的にかき混ぜて焼いてくれる処理を行い、料理した結果(スクランブルエッグという名の戻り値)を、注文したお客さん(呼び出し元)に届けてくれます。

お客さんは「卵」と呼んでいますが、このレストランでは卵のことを「白玉」という専門用語で呼んでいたとします。この専門用語が仮引数です。
同じ卵(引数名)でありますが、客(呼び出し元)とレストラン(関数)で呼び方が違うだけで、内容は全く同じ卵です。

この自動でスクランブルエッグを作れる機械(関数)を定義しないと、お客さんが注文するたびに店員は手作業(処理を一から記述していく)で作らなくてはなりません。

<?php    

  function scrambleEgg($shiratama1, $shiratama2) {
    $ryouri = $shiratama1 * $shiratama2;
    return $ryouri; 
  };

  echo scrambleEgg(5, 10);  //結果:50

?>

上記を例にすると、お客さんは卵2個のことを「」と「10」と呼んでいるのに対して、同じ卵でもレストラン側では「$shiratama1」と「$shiratama2」と呼んでいます。
結果としては卵を使ったスクランブルエッグ(50)という料理が注文したお客さんに届けられますね!

今回はここまで:santa:

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

$php artisan migrateができない→

始めに

「はじめてのLaravel6入門 AWS Cloud9で学ぶ」という本で勉強しています。

開発環境

PHP Version7.2
laravel Verson6.18.3

$ php artisan migrateが実行できない

 Illuminate\Database\QueryException  : could not find driver (SQL: select * from information_schema.tables where table_schema = c9 and table_name = migrations and table_type = 'BASE TABLE')

  at /home/ec2-user/environment/cms/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

  Exception trace:

  1   PDOException::("could not find driver")
      /home/ec2-user/environment/cms/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=localhost;port=3306;dbname=c9", "root", "root", [])
      /home/ec2-user/environment/cms/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

上記のエラー文が出てきて実行できない。

$ php -m | grep pdo
pdo_sqlite

"could not find driver"というエラー文を参考に、MySQLをインストールしようと試みるもうまくいかず。

解決方法

sudo yum -y install php72 php72-cli php72-common php72-devel php72-mysqlnd php72-pdo php72-xml php72-gd php72-intl php72-mbstring php72-mcrypt php72-opcache php72-pecl-apcu php72-pecl-imagick php72-peclmemcached php72-pecl-redis php72-pecl-xdebug

上記のPHPのバージョンを7.2に更新するコマンドで解決できた。

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

PHPファイルをhtml-loaderにかけたときにエラーが出るときの対策

PHPプロジェクトをejs(ejs-html-loader)で管理していて、共通ヘッダーのincludeなど、?> で終わらないファイルが存在する場合、productionビルドでエラーが出る

Parse Error: <?php

これは html-loader(正確にはそこから利用される html-minifier-terser )のminimizeオプションでパースエラーとなるため。

これを回避するためには html-loader に continueOnParseError: true を指定してやれば良い。

webpack.config.js
const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = [
    {
        context: path.resolve(__dirname, 'dev'),
        entry: {
            // ?> で終わらないファイルを含む
            index: './index.php'.
            header: './header.php'
        },
        output: {
            path: path.resolve(__dirname, 'public'),
            filename: '[name].php'
        },
        module: {
            rules: [
                {
                    test: /\.php/,
                    exclude: /node_modules/,
                    use: ExtractTextPlugin.extract({
                        fallback: "raw-loader",
                        use: [
                            {
                                loader: 'html-loader',
                                options: {
                                    minimize: {
                                        continueOnParseError: true
                                    }
                                }
                            },
                            {
                                loader: 'ejs-html-loader',
                                options: {
                                    context: {
                                        // タイムスタンプをPHPファイルに渡すとか
                                        timestamp: +new Date()
                                    }
                                }
                            }
                        ]
                    })
                }
            ]
        },
        plugins: [
            new ExtractTextPlugin('[name].php')
        ]
    }
];

参考: 【備忘録】HTMLMinifierの全オプションについて調査した

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

Azure App ServiceでLaravelアプリのDocument rootでハマった件

背景

Azureを練習しようとGithubに上げている簡単なLaravelアプリをデプロイしようと試みる。
とりあえずApp ServiceでPHPの環境を作成し、デプロイセンターからGithubよりデプロイ。

問題発生

標準でDocument rootが/home/site/wwwrootになっているため、ソースをデプロイしてもうまくアクセスできず。(/home/site/wwwroot/publicを見てほしい)
Ubuntu環境のApacheで動いていることが分かったため、/etc/apache2/sites-available/にある000-default.confやdefault-ssl.confを見て「$APACHE_DOCUMENT_ROOT」を変えてみようとAzureのコンソール画面から『設定>構成>アプリケーション設定』で環境変数を設定してみるも、これも効かず。(SSHで入って環境変数↑をechoしてみると変更はちゃんと効いていたのに...)

解決した方法

正攻法か分かりませんが、Laravelアプリのソースに「.htaccess」置いて回避しました。
Nginx+php-fpmの方に慣れていたのでこの方法に行きつくまでかなりかかりました...。

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteRule ^.*$ /public/$1 [NC,L,QSA]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP基本集

PHPとは

自分の学習用です:santa_tone1:

PHPは、Web開発に特化したプログラミング言語で、「PHP: Hypertext Preprocessor」の略称。

・Webサービスの開発やWebアプリの開発
(集客サイト・SNS・ECサイト・社内の情報共有システムなど)
・WordPressのカスタマイズ・テーマの作成
・データベースに接続してデータの登録・削除・取得

等の他、様々な開発が出来る。

記述方法

【<?php ~ ?>タグ】

<?php ~ ?>タグの中にPHPの命令を記述していく。

例)

<?php echo '<h2>PHP</h2>'; ?>

上記のコードがデベロッパーツール上においては、下記の様にHTMLに変換されて表示されていることが確認出来る。

<h2>PHP</h2> 

また文末にはセミコロン;を付けること

// ←コメントアウトする場合はスラッシュ2つを左翼に記述する

  

【echo】

文字列を出力するための命令文であり、PHPが標準で備えている関数の一つ。
出力する文字列などはシングルクォーテーションもしくはダブルクォーテーションで囲むこと。

<?php echo 'こんにちは'; ?>
<?php echo "こんばんわ"; ?>

また、数値を出力する場合おいては、シングルクォーテーションもダブルクォーテーションもつけないこと。
php
<?php echo 100; ?> //出力結果:100
<?php echo 5 + 5; ?> //出力結果:10

【変数定義】

PHPにおいて変数を定義又は使用する際は、変数名の冒頭に「」マークを付けること。

<?php
  $name = "おはよう"
  echo $name; 
  //出力結果:おはよう
?>  

<?php
  $a = 5;
  $b = 10;
  echo $a + $b;
  //出力結果:15
?>  

【++,--】

変数に1を足したり引いたりするときのみ、++や--を使用することが出来る。

<?php
  $x += 1; //変数に1を足す
  $x -= 1; //変数に1を引く

  $x++;    //変数に1を足す
  $x--;    //変数に1を引く
?>

また、++や--を変数の前と後に付けるかで出力結果が違ってくる。
変数の前に付けた場合、出力前にその文の計算を行う。
変数の後に付けた場合は、出力後にその文の計算を行う。

<?php
  $x = 3;

  echo ++$x; //出力結果:4
  echo $x++; //出力結果:3(変数自体は出力後に4となる)
?>

【文字列の連結】

ドット「.」を使用して文字列を連結することが出来る。

<?php
  $MyName = 'taro';
  echo $MyName.'です'; //出力結果:taroです

  $NotName = 'じゃないです';
  echo $MyName.$NotName; //出力結果:taroじゃないです
?>

また、ドットイコール「.=」を使用することによって、文字列の連結記述を省略することが出来る。

<?php
  $zebra = '黒色';
  $zebra .= 'と白色';
  echo $zebra;  
  //出力結果:黒色と白色
?>

【式展開】

{}に変数を入れることによって、文中で式展開をすることができる。
ただし、式展開を実行する文字列はダブルクォーテーションで囲むこと。

<?php
  $name = 'taro';
  echo "私の名前は{$name}です";
  //出力結果:私の名前はtaroです
?>

【if文】

条件式を()で囲み、処理を{}で囲む。

<?php
  $X = 5;
  if($X > 1){
    echo '$xは1より大きい';
  }
?>
<?php
  $X = 5;
  if(true){
    echo '条件はtrueである';
  }elseif(条件){
    echo '条件はelseifである';
  }else{
    echo '条件はelseである';
  }
?>

また、条件の否定文を記述する場合は、条件式をさらに()で囲み、冒頭に!を付ける。
場合によっては二重括弧を省略出来るケースもある。

<?php
  if(!(条件)){
    //処理内容
  }
  if(!$isOk) {
    //処理内容
  }
?>

【switch文】

条件分岐が多く且つ複雑な場合は、if文よりもswitch文を記述する方が可読性が上がる。
条件式には「case 〇〇:」を用い、条件に該当するcase文が実行される。
〇〇には文字列や数値を記述する。
break文を記述していない場合、後ろに続く他のcaseが続けて続行されてしまう。

<?php
  switch(条件) {
    case 0:
      //処理内容
      break;
    case 1:
      //処理内容
      break;
    case 2:
      //処理内容
      break;
    case 3:
      //処理内容
      break;
    default:  //いずれのcaseにも該当しない場合の処理は「default」を使って記述する
      //処理内容
      break;
  }
?>

【配列】

配列を定義する場合は「array( ' ' , ' ' , ' ' );」と記述することが出来る。
ただし、5.4以降からは、「変数名 = [ ' ' , ' ' , ' ' ]」と、配列コンストラクタ「Array」を使う方法から配列リテラル「[ ]」を使う方法が推奨されている。

//配列を定義
$colors = ['red','yellow','blue']; 

//配列の取り出し方
echo $colors[0]; //redが出力される

//配列の追加
$colors[] = 'green'; //配列の末尾に「green」を追加

//配列を上書き
$colors[0] = 'white'; //配列0番目に入れられていた「red」を「rainbow」に上書き

【連想配列】

連想配列とは、複数のデータをまとめて管理する場合に使用される。
インデックスはなく、オブジェクトの様にキーとバリュー(値)を定義し、データ同士はコンマ,で区切る。

<?php
  $human = [
    'age' => '20',
    'name' => 'taro',
    'from' => 'japan'
  ];

  //配列の取り出し
  echo $human['name']; //出力結果:taro

  //データの追加
  $human['language'] = 'japan'; //変数humanに「'language'=>'japan'」が追加された
?>

【繰り返し処理】

繰り返し処理には「for文」を使用する。
変数の初期化を行い、次に繰り返すための条件式を記述、変数値の更新を記述していく。
()の中の条件式などはセミコロン;で区切ること。

<?php
  for($i= 1, $i <= 100, $i++) {
    echo $i.'<br>';  //1から100までが改行されながら出力される
  }
?>

【while文】

for文と同様に繰り返し処理の一つ。
for文の様に予め変数の初期化や繰り返し処理を定義せず、繰り返しの条件のみを記述するので、変数の初期化や処理内容に繰り返しの処理は別記する必要がある。

例)2から100までを繰り返し、偶数のみ出力。

<?php;
  $i = 2;

  while($i <= 100) {
    if($i % 2 == 0) {
      echo $i.'<br>';
    }
  $i++;
    }
?>

また、break文を用いて、繰り返しの中断条件を記述することも出来る。
その場合はif文を用いることが多い。
他にも特定の条件に該当した場合のみ繰り返し処理をさせないための「continue文」もある。

例)1から1000まで繰り返させて出力させるが、501以上の数字を表示しないようにする。
また、3の倍数だけ出力させない処理を加える。

<?php
  for($i = 1; $i <= 1000; $i++) {
    if($i > 500) {
      break; //500より大きくなったら中断
    }

    if($i % 3 == 0) {
      continue;  //3の倍数の時だけループ処理を抜ける
    }

    echo $i.'<br>';
  }
?>

【foreach文】

foreach文とは、配列または連想配列に対して、先頭のデータから順に繰り返し処理を行わせる命令である。

<?php
  foreach(配列 as 値変数 ) {
    繰り返したい処理;
  }

  foreach(配列 as キー変数 => 値変数) { //キー変数は省略可能
    繰り返したい処理;
  }
?>

スクリーンショット 2020-04-03 5.42.20.png

<?php
  $scores = ['数学' => 70, '英語' => 90, '国語' => 80];

    foreach($scores as $key => $value) {
      echo $key.'は'.$value.'点です'.'<br>';
    }

    //出力結果

    //数学の点数は70点です
    //英語の点数は90点です
    //国語の点数は80点です
?> 

例)複数の連想配列が配列として入っている場合

<?php
$menus = [
  ['name' => 'パスタ', 'price' => 900],
  ['name' => 'ステーキ', 'price' => 1200],
  ['name' => '牛丼', 'price' => 600]
];

foreach($menus as $menu) {
  $price = $menu['price'];
  echo $menu['name'].'は'.$price.'円です';
  echo '<br>';

  $totalPrice += $price;
};

echo '合計金額は'.$totalPrice.'円です';

//出力結果

//パスタは900円です
//ステーキは1200円です
//牛丼は600円です
//合計金額は2700円です

?>

【関数の呼び出し】

関数名();」と記述する。
PHPには様々な処理を行うことが出来る関数が標準で用意されている。
例)

<?php

  $ProgrammingLanguages = ['HTML', 'CSS', 'PHP'];

  // countを用いて要素数を出力

    echo count($ProgrammingLanguages);
?> 

【関数の定義】

関数は「function 関数名() {処理内容}」と記述することによって定義することが出来る。

<?php
  function hello(){  //関数の定義
    echo 'Hello';
  };

  hello();  //関数の実行(Helloが出力される)
?>

また、関数には引数を渡して(値渡し)、処理の内容に加えることも出来ます。
引数の数は複数でも構いません。
処理の文中には、引数名と同名の仮引数を使用して処理内容を定義します。

スクリーンショット 2020-04-03 19.43.14.png

<?php    

  function printRectangleArea($height, $width) {
      echo $height * $width;
  };

  printRectangleArea(5, 10);  //出力内容:50

  ?>

【戻り値とは】

定義した関数の処理結果を指定することが出来る。
この返す処理結果を戻り値と言い、「return」を使用する。

<?php

  function getCircleArea($radius) { //関数を定義
    return $radius * $radius * 3;  
    //処理内容に記述している$radiusが仮引数である
    //returnを使用して戻り値(値を返す処理内容)を指定する
  };

  $circleArea = getCircleArea(5); //定義した関数に5を引数に指定して、戻り値を変数化

  echo $circleArea;  //変数の呼び出し

?>

【FizzBuzz問題】

1から100までの数字を順番に表示させる。
ただし、
・その数が3で割り切れるなら、「Fizz」
・その数が5で割り切れるなら、「Buzz」
・その数が3でも5でも割り切れるなら、「FizzBuzz」をその数字の代わりに表示させる。

<?php
  for($i = 1; $i <= 100; $i++) {
    if($i % 3 == 0 && $i % 5 == 0) {
      echo 'FizzBuzz'.'<br>';
      continue;
    } elseif($i % 3 == 0) {
      echo 'Fizz'.'<br>';
      continue;
    } elseif($i % 5 == 0){
      echo 'Buzz'.'<br>';
      continue;
    }
    echo $i.'<br>';
  }; 
?>

今回はここまで:santa:

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