6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP】PHP7技術者認定初級試験対策 ※用語の意味が中心

Last updated at Posted at 2022-06-02

PHP7技術者認定初級試験を受けるにあたって勉強したところを備忘録として残しておきます。
自分用のメモのようなものなので、もし間違っている箇所等ありましたらご指摘いただけますと幸いです。

エイリアス(別名)

独自につけるニックネームと覚えれば良い。
クラスや関数に別名をつけることでコードの効率化、簡略化を図ることができる。

クロスサイトスクリプティング(XSS)

悪意あるユーザがフォームから悪いデータを送信することで、サーバに意図しない動作をさせること。

■防止策

 1. データをそのまま送信できなくさせる。文字からHTMLタグを取り除くstrip_tags()関数を使用
 2. 特殊なHTML文字(例 & < > “)を変換させるhtmlentities()関数を使用

$_SERVER(サーバー変数)

ヘッダ情報、パス情報、スクリプトの位置のような情報を提供する。

① $_SERVER['PHP_SELF'];

(例) http://example.com/test.php/foo.php というアドレスの場合

/test.php/foo.php
$_SERVER['PHP_SELF']
実行結果
/test.php/foo.php

② $_SERVER['SCRIPT_FILENAME']
現在のスクリプトの絶対パス

③ $_SERVER['SCRIPT_NAME'];
現在のスクリプトのパス。 スクリプト自身のページを指定するのに有用です。

④ $_SERVER['REQUEST_TIME_FLOAT']";
リクエスト開始時のタイムスタンプ (マイクロ秒までの精度)。

⑤ $_SERVER['REQUEST_TIME'];
リクエスト開始時のタイムスタンプ。

⑥ $_SERVER['QUERY_STRING'];
ページにアクセスした際、もし検索引数があればそれが格納される。

スクリーンショット 2022-06-02 12.36.44.png

⑦ その他

 $_SERVER['HTTP_CONNECTION'];

 $_SERVER['HTTP_HOST'];

 $_SERVER['HTTP_ACCEPT’];

など…
いずれも、「ヘッダの内容」を返す。

⑧補足
あるいは、var_dump($_SERVER);とすれば全部のserver情報を出力できる。

▼ 参考
PHP $_SERVER(サーバー変数)のすべて!【初心者向け基本】
[PHP] $_SERVER の PHP_SELF / SCRIPT_NAME / REQUEST_URI の違い

スーパーグローバル変数

  • $GLOBALS ※これだけ「_」がない
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES (ファイル変数) HTTP postでアップされた値を取得する
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV (環境変数)

execメソッドとexecuteメソッド

メソッド名が似ているが、両方とも存在する。

■execメソッド

正しくは「PDO::exec()」と記述する。
発行したSQL文によって更新もしくは削除された「行数」を返す。1行も作用しなかった場合、PDO::exec() は「0」を返す。

DELETE文の例

DELETE文によって削除された行数をカウントします。

<?php
// DBへの接続
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);


// FRUIT テーブルからcolour = 'red'に該当する全ての行を削除
$count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'");

// 削除された行数を返す
print("Deleted $count rows.\n");
?>
出力結果
Deleted 1 rows.

■executeメソッド

プレースホルダーに代入すべき値を指定し、プリペアドステートメントを実行する。
prepare()とセットと覚えること。

■prepare()メソッド

クエリのパース(=SQL文の準備)を行う。

名前付きパラメータを用いて SQL ステートメントのテンプレートを準備する例
<?php
// 値の配列を渡してプリペアドステートメントを実行する
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array('calories' => 150, 'colour' => 'red'));
$red = $sth->fetchAll();
// 配列のキーの前にも、コロン ":" を付けることができます(オプション)
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>

SQLインジェクションとプレースホルダー

SQLインジェクションとは攻撃手法の一つで、開発者が想定していないSQL文を悪意あるユーザが注入(injection)してしまうこと。
そこで登場するのがプレースホルダー。
変動する箇所を「値」として処理することで攻撃から守ることができる。

値が変動する箇所(変数)→プレースホルダ→DBに登録

例
$sql = 'SELECT * FROM users where username = :username';
このように、先頭に「:」を入れるか、もしくは「?」を入れることでプレースホルダー化できる。

fopen関数とfgets関数

fopen関数でファイルポインタをオープンし,fgets関数で「一行だけ」読み取る。

モードの例
rb 読み込み
wb 書き込み(上書き)
ab(追記)

詳細は※こちらに記載しました。

ストリームコンテキスト(ストリーム環境)

stream

連続したデータの流れの意味

context

状況、環境の意味

CSVを1行ずつ読み込んで、DBに保存したりするイメージ。
file_get_contentsだと全データを一括で取得するため、何十メガバイトもあるような大きいファイルを読み込むとPHPのメモリが足りなくなってエラーが起きたりする。
そこでこの「ストリーム」という機能がある。

file_get_contents

  • ファイルの全データを読み込む
  • ストリームコンテキストを使用したHTTPヘッダを送信する
  • 外部サイトにアクセスする
  • スクリーンスクレイピングを行うことができる

スクリーンスクレイピング

Webサイトから画面情報を抽出して利用する技術のこと。

feof関数

ファイルが最後まで読み込まれたか確認するための関数。

fgetcsv関数

CSVファイルのデータを「配列」として読み込むための関数。

cURL

HTTPリクエストにより外部サイトにアクセスするための関数。
「file_get_contents」でも外部サイトにアクセスはできるが、リクエスト方法をカスタマイズしたい時などにはcURL関数を利用する方がいいでしょう。

以下❶〜❹を記述していくことで外部サイトへアクセスできる。

❶curl_init関数 ※引数に「http_build_query()関数」を入れることでURLを作成
❷curl_setopt関数
❸curl_exec関数
❹curl_close関数
// リクエストヘッダー 設定
$headers = array(
    "Content-Type: application/json",
);

/* curlセッションを初期化する */
$ch = curl_init();

/* curlオプションを設定する */
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");

/* curlを実行する */
curl_exec($ch);

/* curlセッションを終了する */
curl_close($ch);

外部サイトにアクセスするための関数は2つある

  • file_get_contents
  • cURL(色々カスタマイズできる)

Composer PHPunit PHAR

【Composer】

Rubyで言うところのBundlerと同じで、パッケージ管理ツール。
バージョンの依存関係を管理したりする。
依存するライブラリを設定ファイルに書いてコマンドを叩けば、ライブラリのインストールと利用準備が整う。

【PHPUnit】

ユニットテスト用のツール。
ユニットテスト=単体テスト。
単体テストとは、クラスや関数などの小さな単位で動作を確認するテストのことである。

【PHPunitのメリット】

手動では面倒なテスト手順を「自動化」して繰り返し実行できるようになること

【PHAR】

Java の JAR アーカイブと似た概念のもの。

parse_ini_fileとiniファイル

iniファイルを読み込んで、設定値として利用する関数。
実行すると連想配列として値を得ることができる。

iniファイルとは、設定ファイルのこと。
テキスト形式のシンプルなフォーマット。

プロファイラ

コンピュータプログラムが実行される様子を監視・記録し、プログラム中の各箇所の動作順や実行時間などを集計・解析するプログラム。

スクリーンショット 2022-05-31 12.48.00.png

■プロファイラを使うメリット

・レスポンスタイムなど、パフォーマンスを改善することができる

Swift Mailer

  • メールライブラリ。
  • 簡単便利にメール送信ができる。
  • Composerでのインストールがおすすめ。

Velocity

問題文に出てきたが、これはJavaのフレームワークなのでPHPには一切関係なし。

各PHPフレームワークのテンプレートエンジン

【Laravel】

Blade

【Symfony】

Twig

【Zend Framework】

PHP

ドキュメントルート

Webアプリに表示させるファイルを置くディレクトリのこと。
ドキュメントルート配下にコードを書かないと、Webサーバを実行してもブラウザに表示されないため注意。

PHP REPL

php -a コマンドで対話型のPHPコードの実行

mb_detect_encording

第一引数に渡した文字列の文字コードを判定

<?php
$str = "あいうえお";
echo mb_detect_encoding($str);
?>
出力結果
UTF-8

mb_internal_encording

php.iniの設定値の1つ。
「内部文字エンコーディング」と呼ばれる。

■内部文字エンコーディング

マルチバイト文字列、mbstring関数(mb_***の関数)におけるデフォルトの文字エンコーディングのことを指している。
PHPの場合は「UTF-8」である。

内部文字エンコーディングをUTF-8に設定し、表示させる例
<?php
/* 内部文字エンコーディングをUTF-8に設定 */
mb_internal_encoding("UTF-8");

/* 現在の内部文字エンコーディングを表示 */
echo mb_internal_encoding();
?>

内部文字エンコーディングに設定できる文字コード

  • SJIS
  • SJIS-win
  • ISO-2022-JP
  • JIS
  • UTF-8
  • EUC-JP

mb_convert_encording

mb_convert_encording関数では、文字エンコーディング(符号化)を変換(convert)することができる。
引数は、①変換する文字列, ②変換後の文字コード(to), ③変換前の文字コード(from)の順番なので気を付ける。

文字列の文字コードを文字エンコーディングを指定して変換する例
$str_utf8 = "あいうえお"; // UTF-8のあいうえお
$str_sjis = mb_convert_encoding($str_utf8, "SJIS", "UTF-8"); // UTF-8→SJISに変換

ヒアドキュメント

長い文字列を変数に格納するために使う。
自動的にprint出力されるから便利。

<?php
echo <<<EOF
出力する
ながーーーーい文字列を
記述します。
EOF;
?>
実行結果
出力する
ながーーーーい文字列を
記述します

printfメソッド

Fはformatのfで、ログ出力など、出力形式を統一したい場合に重宝する関数(他にもsprintfやvprintfなんかもあったりする)。
「%」は、エスケープするためのもの。

例①
printf("%05d", '123');
実行結果①
00123
例②
<?php
printf ('%s %s %s<br/>', 'Hellow', 'World', '!!');
printf('今日は %d年%d月%d日です。<br/>', date('Y'),date('m'),date('d'));
?>
実行結果②
Hellow World !!
今日は 2018年12月7日です
例③
<?php
$num =        5;
$location =   '木';
$format =     'あの%sに%d匹の猿がいます。';
 
printf($format, $location, $num);
?>
実行結果③
あの木に5匹の猿がいます
例④
<?php
$double1 =        round(0.12,2);
$double2 =        round(2.28,2);
$double3 =        round($double1*$double2,4);
$format =         '%f×%fは%fです。';
 
printf($format, $double1, $double2, $double3);
?>
実行結果④
0.120000×2.280000は0.273600です

0が4つなのはround($double1*$double2,4)というように小数点第4位まで表示すると指定しているから

④についてはround()関数も関わってくる。

round()関数

2つ目の引数に、小数点何桁まで表示する(何桁より下の桁で四捨五入する)ということを指定できる。

■指定可能な型

b:引数を整数として扱い、2進数として表現します。

c:引数を整数として扱い、ASCII値の文字として表現します。

d:引数を整数として扱い、10進数として表現します。

e:引数を科学記法として扱います(例:1.2e+2)。精度の指定子は、PHP5.2.1以降では小数点以下の桁数を表します。それより前のバージョンでは、有効数字の桁数(ひとつ小さい値)を意味していました。

E:%eと同じですが、大文字を使います(例:1.2E+2)。

f:引数をdoubleとして扱い、浮動小数点数として表現します。

F:引数をfloatとして扱い、浮動小数点数として表現します(ロケールに依存しません)。PHP5.0.3以降で使用可能です。

g:%eおよび%fの短縮形。

G:%Eおよび%fの短縮形。

o:引数を整数として扱い、8進数として表現します。

s:引数を文字列として扱い、表現します。

u:引数を整数として扱い、符号無しの10進数として表現します。

x:引数を整数として扱い、16進数として(小文字で)表現します。

X:引数を整数として扱い、16進数として(大文字で)表現します。

【PHPマニュアル】printfの説明と使い方

trueになる条件

問題に「"php" > "perl”」の結果がtrueになるというのがあったが、理由は分からないまま……

falseになる条件(間違えたところのみ厳選)

❶空の文字列
<!-- サンプルコード -->
<?php
if('') echo 'TRUEと見なされます。';else echo 'FALSEと見なされます。';
?>
❷空の配列
<!-- サンプルコード -->
<?php
$ary = array();
if($ary) echo 'TRUEと見なされます。';else echo 'FALSEと見なされます。';
?>

if($var) isset empty.png

PHP の 論理値 TRUE と FALSE

strcmp関数(cmpは、compareの略)

strcmp(文字列1, 文字列2)
文字列1と文字列2が同じ場合、0を返します。
文字列1が文字列2よりも大きければ、プラスの数値を返します。
文字列1が文字列2よりも小さければ、マイナスの数値を返します。

静的プロパティ、静的メソッド、this、self

JavaでいうところのStatic変数とStaticメソッド。
Staticメソッドに関しては「クラス変数」ともいうように、Class名.変数でも表すことができる。つまり抽象的である。

下図の覚え方

「self」 と 「$this」だけ覚えちゃえばOK。
あとはプロパティはそれぞれ「$」がついていない方につければいい。
スクリーンショット 2022-06-01 17.37.56.png

■静的プロパティの使い方

staticプロパティ「stNum」に加算する例
self::$stNum += $plus;
// 静的プロパティの宣言は、Javaと同じようにメンバにstaticをつけるだけでOK

■静的メソッドの使い方

ProductクラスのcalculateTotalPriceメソッドを呼びだす例
Product::calculateTotalPrice($product1, $product2, $product3);

同値演算子(===)

■等値演算子(==)と違うところ

同値演算子(===)は、値に加え、「データ型」まで含めた完全一致かを判定するということ。

ブルートフォース攻撃(総当たり攻撃, 力任せ攻撃)

暗号解読方法のひとつで、可能な組合せを全て試すやり方。

DoS/DDoS攻撃

DoS

1台のパソコンでターゲットに大量のアクセスやデータを送り、負荷をかけること

DDoS

大量のパソコンにDoS攻撃を行うこと

SQL文の基礎

CREATE TABLE flowers (flower_id INTEGER PRIMARY KEY, flower_name VARCHAR(255),price DECIMAL(6,2));

VARCHARもCHARも文字列型だが(だから名前も似ている)、VARCHARは可変長文字列という特徴がある。

VARCHAR(255)とは、最大文字数が255文字ですよ、ということ。

DECIMALは固定少数点数型と言って、正確な(=固定された)データを格納するときに使う。(金銭データなど)

例 DECIMAL型のカラムを持つテーブルを作成
create table numtest(num1 decimal(5, 2));

小数点以下が2桁、全体で5桁の数値を格納することができるので、格納できる値は、-999.99 から 999.99 の範囲になります。
DECIMAL(6,2)だと、小数点以下が2桁で全体で6桁だから、-9999.99〜9999.99の範囲という意味

SELECT * FROM flowers2 where price > 350 ORDER BY price DESC, flower_name

この場合、レコードはまず左側の「price DESC」によって「価格の降順」に並べられ、価格が同じレコードが複数存在する場合に限って、右側の「flower_name」に従って並べ替えます。
この時、「flower_name」はデフォルトでaskであることに注意!!(無指定時つまりデフォルトではaskとなる)

setcookie関数

setcookie("abc", 789, time()+60*60*24*3);
第1引数 クッキー名
第2引数 クッキーの値
第3引数 クッキーの有効期限
第4引数 クッキーを保存するパス
第5引数 クッキーが有効なドメイン
第6引数 trueと書いておいた方がいい。trueと書いておけば、https(セキュア)の時だけcookieを作る。httpの時はクッキーが作られない。
第7引数 trueと書いておいた方がいい。HTTPを通してのみクッキーにアクセスできるようになる。つまり、JavaScriptのようなスクリプト言語からはアクセスできなくなるということを意味する。XSS攻撃を防ぐことができる。

str_replaceメソッド 引数が3つ以上あるとき

1が2に置き換わると覚えればOK。

<?php
$sample = 'hello, everyone!!!!';
$good_morning = str_replace('hello', 'Good morning!',$sample);
var_dump($good_morning);
$good_afternoon = str_replace('hello', 'Good afternoon!',$sample);
var_dump($good_afternoon);
$good_evening = str_replace('hello', 'Good evening!', $sample);
var_dump($good_evening);
?>
実行結果
string(27) "Good morning!, everyone!!!!"
string(29) "Good afternoon!, everyone!!!!"
string(27) "Good evening!, everyone!!!!"

file_put_contents関数

指定したファイルに文字を書き込むための関数。

「foge.php」ファイルに結果を出力させたい場合。
<?php
$file = "foge.php";
$contents = "これは書き込みたい内容です";
file_put_contents($file, $contents);
var_dump($file);
?>
実行結果
// foge.php ファイルにちゃんと書き込まれている!
これは書き込みたい内容です

session.gc_maxlifetime構成ディレクティブ(gcはガベージコレクション)

  • サーバに保存されているセッションファイルを保護する有効期限(=セッションの寿命)。
  • デフォルトは24分(1440秒)。
  • iniファイルに書く。

session.cookie_lifetime

  • Cookieの有効期限。
  • デフォルトは0で"ブラウザを閉じるまで"という意味。
  • iniファイルに書く。

print_r()関数とprintの違い

そもそもprintは関数ではない。print 'Hello world’;とすると「1」が返ってくる。
そのためprintは配列を扱えないが、print_rは配列も文字列もなんでも扱える。

<?php
$array = ['りんご', 'メロン', 'みかん'];
print_r($array);
?>
実行結果
Array
(
    [0] => りんご
    [1] => メロン
    [2] => みかん
)

$_SERVER['argv'][1]

Javaの「public static void main(String[] args)」のargsと同じ!!
つまり、以下を実行した場合「これはテストです」は$argvという配列の中に格納されることを意味する。

ターミナル
php sample.php これはテストです
$_SERVER['argv’][1]とすると、配列の1個目の要素を取ってくる
※[0]じゃなくて[1]と書く!!!!

argc(cはcountのc)

コマンドライン引数の数をカウントする。
そのため$argcには引数の数が格納される。

ターミナル
php sample.php いちご メロン スイカ
この場合 $argcは「3」となる。

array_splice関数

配列の「任意の場所」に要素を追加したり、既存の要素を置き換えたり、削除したりといった処理を行う。

includeとrequireの違い

どちらも関数を利用するときに使うもので、
外部ファイルに定義された関数を利用する際に記述する。

■存在しないファイルを宣言した場合の挙動

requireは致命的なエラーとしてプログラムを終了する
includeは警告文は出すけどプログラム自体は続行するため不適切な処理が行われる可能性あり。

アロー演算子とダブルアロー演算子

❶アロー演算子「->」

プロパティやメソッドにアクセスするときに使う

プロパティにアクセスする場合
<?php
class User {
    public $name;       // 名前
    public $age;        // 年齢
    public $haveFever;  // 健康状態(true:悪い、false:良好)
 
    function __construct(string $name, int $age, bool $haveFever)
    {
        // アロー演算子を使ってプロパティにアクセス
        $this->name = $name;
        $this->age = $age;
        $this->haveFever = $haveFever;
    }
}

$sample_user = new User("Sato Takashi", 25, false);
?>

補足:アロー演算子を複数回続けることもできる

echo $sample_user->products[$i]->name;

❷ダブルアロー演算子「=>」

連想配列を取り扱うとき、アロー関数を実装するときに使う。

$fluit_price = [
    // 「キー => 値」 の形で記述する
    "Apple"  => 100,
    "Orange" => 200,
    "Grape"  => 300
];

名前空間のエイリアスの作成方法

名前空間とは、文字通り名前の空間のことで、ここからここまでのコードが○○という空間に属していると定めることができる。
空間が違えば、同じ関数名を定義して使うことができる。

use My\Full\Classname as Another;

プリペアドステートメント機能(実行したい SQLをコンパイルしたテンプレート)

■メリット

  • クエリのパース (準備) が必要なのは最初の一回だけで、 同じパラメータを指定して何度でもクエリを実行することができる点

  • 使用するリソースが少ないため高速に動作する点

■PHPでプリペアドステートメントを使用する方法

prepare()関数を使用する。

<?php
$userName = 'mysql';
$password = 'mysql';
// PDOオブジェクトの生成(データベース接続)
$pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password);
 
// プリペアドステートメントで SQLをあらかじめ用意しておく
$stmt = $pdo->prepare('select * from user where id = ? and name = ?');


※「?疑問符プレースホルダー
※「:idなど名前で使用するのは名前付きプレースホルダー

エミュレート機能

エミュレート機能を有効にすると、DBのプリペアドステートメント機能を使わずに、PHP側でプリペアドステートメント機能を実現できる。
エミュレート機能を使うことで不要なDBアクセスを減らすことができるので処理速度の向上が期待できます。
PDO::ATTR_EMULATE_PREPARES 属性の値に false を指定することで、PDOのエミュレート機能を無効にできる。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

クエリ

SQL文のことをエンジニア界隈ではクエリと呼ぶ。
「SQL文を書く」=「クエリを投げる」=「DBへ送信(通信)する」

SELECT * FROM users WHERE name = 'ウェブカツ太郎';

サニタイズ(無害化する、置き換える)

ユーザが入力した文字データを受け取る際に、コンピュータが読めるように、一定の規則に従って別の表記に置き換えること。

引数の順番について

メソッドによって、第一引数が第二引数に変換されるものとその逆のパターンとあるため、順番に注意すること。

mb_convert_encording()メソッド

$str_sjis = mb_convert_encoding($str_utf8, "SJIS", "UTF-8");

UTF-8からSJISに変換

str_replace()メソッド

$good_morning = str_replace('hello', 'Good morning!',$sample);

helloからGood morning!に変換

file_put_contents()メソッド

file_put_contents($file, $contents);

指定したファイル($file)へ内容($contents)を書き込み

PSR (PHP Standard Recommendation)

  • PHP標準勧告。
  • PHPの仕様が書かれており、PHPでのプログラミング概念の標準化に役立つ。

エラーメッセージの種類

スクリーンショット 2022-06-02 17.56.45.png

■プログラムの動作を停止させるエラー

ParseとFatalのみ!!

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?