January 1, 2016
■スクラム
https://www.bangboo.com/cms/blog/page_321.html
https://www.ryuzee.com/contents/blog/7137
プロダクトオーナー(バックログ並び)
スクラムマスター(外部からチームを守る)
デイリースクラム(毎朝)
プロダクトバックログをスプリントバックログに
ベロシティ(工数)
レビューをしてリリース可能な状態に(実際のリリースはビジネス判断)
スプリントレビュー(デモ)
スプリントレトロスペクティブ(チーム改善)
■PHP開発
http://www.objective-php.net/
オブジェクト指向(クラス、メソッド、プロパティ)、MVCについて
まずプログラムが動くようにしてから必要ならクラス化やMVCにすればよい、大体は不要だが
fatコントローラならページ化した方がいいのだが
MVCのモデルMをロジックとデータの2段構成→ファイル増え逆に一元管理ができないしょ
利点:オブジェクト指向は他言語への応用力鍛錬、MVCはVの役割分担、参入障壁
Cを無くしVがハンドルする、Page-Objectモデルが、レスポンスも早く、込み入った処理/デザインも出来てよいけど
靴紐やら枠嵌よりHTMLやら言語やらはネイティブがいい
SPA(Single Page Application)はJSがサーバに欲しいデータを要求する、MVCがダメだからPOモデル
■オブジェクト指向のルール
カブセル化:隠蔽するべくできるだけpublicメンバを使わない
継承:親クラスのプロパティやメソッドが引き継がれる(private以外の)、ルールが多くありOOにできる
ポリモーフィズム(多態性):オーバライドやオーバロードでメソッドを状況で使分ける
//// アクセス修飾子
public オブジェクト外からアクセス可
private オブジェクト外からアクセス不可、継承されない
protected オブジェクト外からアクセス不可、継承される
//// コンストラクタ
__construct()はインスタンスの生成時に一度だけ自動的に実行される
アクセス修飾子は基本的にはpublic
//// オーバーライド
継承クラスで親クラスのメソッドを上書きし乗っ取る
//// 静的メンバ
static修飾子をつける
インスタンスを生成しなくてもアクセス可能(publicにしておくと)
「クラス名::メソッド名()」で呼び出す
staticメソッドはインスタンスから呼び出せない(クラス自体に属する)
クラスのメソッドでなく関数のような役割
//// クラス定数
const 定数名 = 値
アクセス修飾子は付けられません(クラス定数はpublic扱い)
定数名には「$」は付けません、define関数と同じ
設定値の格納用として普通使う、クラスで纏め分類しておくとdefine関数より管理がし易い
静的フィールドとの違いは値の変更が出来るか出来ないかだけ
//// 抽象クラス
abstractをつける
直接インスタンスを生成できず必ず継承して使用するクラス
継承先のクラスで必ずオーバーライドする必要がある
抽象メソッドとは処理内容を持たずに名前だけ定義されたメソッド
共通で行う処理を抽象クラスとして定義し各画面の処理は抽象メソッドとしておく使い方
//// インターフェイス
インターフェイスとは抽象メソッドのみ定義可能なクラス
抽象メソッドだがabstractはいらない
アクセス修飾子にはpublicしか指定できない
直接インスタンスの生成はできない
実装にはインターフェイスで定義されているメソッドは全て実装する必要があり、アクセス修飾子はpublicで引数の数も名前も完全一致が必要
インターフェイスの実装でポリモーフィズムであることを保障できる
インターフェイスは多重実装可
class FoodProduct implements IProduct, IFood
//// タイプヒンティング
引数で受取るクラスやインターフェイスを制限できる
public function addProduct(Meet $product) ←Meetクラスを指定
public function addProduct(IProduct $product) ←Iproductインターフェイスを指定
//// 名前空間
異なる名前空間同士では同じ名前のクラスが定義できるようになる(長名になりがちなので)
名前空間未指定はグローバル空間、\をつけるとグローバル throw new \Excetpion('hogehoge');
クラス定義ファイルの頭にnamespaceキーワードで名前空間を定義 namespace Food;
使用は2つの方法
1)namespaceを含めたフルパスでクラス名を指定し使用 $item = new \Food\Product();
2)前空間の利用宣言をあらかじめする use Food\Product; $item = new Product();
同名だと衝突するので別名や階層化やオートローダ http://www.objective-php.net/basic/namespace
namespace はディレクトリではなく別名であり、
接頭文でもなく、関数名が被らないように名付時と使用時の両方で宣言してるだけ
関数名被らなければ使用時に気にしすぎる必要はない、下記でOK
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;(App\Http\Controllers\App\Http\Requestsというわけではない)
//// 例外
PHPは勝手に例外を投げないので自分で書くのであまり意味がない(新しい関数やクラスは例外を投げてくれるが)
try {
if($a!==1){ throw new Exception('Bad'); }
echo "End";
} catch (Exception $e) {
Logger::write($e->getMessage());
echo "ERror";
}
-> ERror
//// サンプル
<?php
//カプセル化、アクセス修飾子、コンストラクタ、セッター/ゲッターのメソッド、継承
class Product{
protected $name; // 商品名
protected $price; // 価格
public function __construct($name){
$this->name = $name;
}
public function getPrice(){
return $this->price;
}
public function setPrice($price){
$this->price = $price;
}
}
class FoodProduct extends Product{
private $expire;
public function setExpire($expire){
$this->expire = $expire;
}
public function getExpire(){
return $this->expire;
}
}
$food = new FoodProduct('肉');
$food->setPrice(100);
$food->setExpire(30);
echo '価格を' . $food->getPrice() . '円に設定しました。';
echo '賞味期限を' . $food->getExpire() . '日に設定しました。';
?>
<?php
//静的メンバ(静的メソッド)
class PriceFormater{
private static $fee = 10;
public static function formatJapanese($price){
$price = number_format($price + self::$fee);
$price = $price . '円';
return $price;
}
}
$price = PriceFormatter::formatJapanese(3000);
?>
<?php
//クラス定数
class Tax{
const IMPORT_TAX_RATE = 0.08;
}
class Product{
const TAX_RATE = 0.05;
private $price = 100;
public function getSalePrice(){
$tax = $this->price * self::TAX_RATE;
$tax2 = $this->price * Tax::IMPORT_TAX_RATE;
$price = $this->price + $tax + $tax2;
return $price;
}
}
var_dump(Product::TAX_RATE);
$prd = new Product();
$price = $prd->getSalePrice();
?>
<?php
//抽象クラス(文字追加の処理所要時間測定)
abstract class TimeMeasurer{
abstract protected function process();
public function exec(){
$startTime = $this->getMicrotime();
$this->process();
$endTime = $this->getMicrotime();
$procSecs = $endTime - $startTime;
echo sprintf('処理所要時間は%s秒でした。', $procSecs);
}
private function getMicrotime(){
$splitedMt = explode(' ', microtime());
return $splitedMt[0] + $splitedMt[1];
}
}
class TestClass extends TimeMeasurer{
protected function process() {
for ($i = 0; $i < 1000000; $i++) {
$str .= 1;
}
}
}
$test1 = new TestClass();
$test1->exec();
?>
//インターフェイス、タイプヒンティング、(ポリモーフィズム)
---- Car.php
interface Car{
public function start();
}
GasolineCar.php
class GasolineCar implements Car{
public function start(){
echo sprintf('%s エンジンOK', $this->gasolineIgnition());
}
//関数の戻り値の型をstringで指定
private function gasolineIgnition(): string
{
return 'brrr';
}
}
---- DieselCar.php
class DieselCar implements Car{
public function start(){
echo sprintf('%s エンジンOK', $this->DieselIgnition());
}
private function DieselIgnition(): string
{
return 'vvvv';
}
}
---- driver.php
class driver{
public function on(Car $car){
$car->start();
}
}
index.php
$driver = new driver();
$driver->on(new GasolineCar());
$driver->on(new DieselCar());
//// OO設計
index.php
Dispacherを呼ぶ
↓
abstract class Dispatcher
URL引数を取得
class siteDispatcher extends Dispatcher
URL引数から適切なコントローラを呼ぶ
↓
↓abstract class RequestVariables
↓ $_POST、$_GETを取得
↓class Post extends RequestVariables
↓ Post変数
↓class QueryString extends RequestVariables
↓ Get変数
↓class Request
↓ Post変数とGet変数を纏める
↓
↓class ModelBase
↓ モデルの共通機能(DB接続等)をstaticメソッド、継承してもいい
↓
class CartController extends ControllerBase
カート用コントローラ(ヘッダーやコンテント)
abstract class ControllerBase
カート以外でも使用する共通機能(Post/Get取得やビュー呼出)
↓
class CartHeader
ユーザ情報等のカートのヘッダー情報のモデル
class CartContent
リスト取得や追加や削除の操作のモデル
====
//// オブジェクト指向のメモ
コントローラのメソッド内では変数にスコープをつけなくて良い
メソッド外にはpublic/private/protectedを付ける
インスタンス生成 $a = new Class名; コンストラクタに渡す場合は new Class名(引数);
メソッド使用 $a->メソッド();
-> (クラスのフィールド名、メソッド名) アロー演算子 メンバ変数やメンバ関数を使う
:: (クラスのメソッド名) スコープ演算子 インスタンスを生成していないクラスのメンバ関数を使う事が出来る
class Pet{
var $dog = "wan";
var $cat = "nyan";
function func(){
echo "Welcome";
}
}
echo Pet::cat;
$obj = new Pet();
echo $obj->func();
phpにおける :: と ->に違いについて
アロー(->)演算子を使う場合 インスタンスプロパティとインスタントメソッドにアクセスする echo $a->name
スコープ定義(::)演算子を使う場合 静的プロパティと静的メソッドにアクセスする
https://qiita.com/mpyw/items/41230bec5c02142ae691
インスタンスプロパティ | インスタンスメソッド | 静的プロパティ | 静的メソッド | |
外部から | $v->name | $v->name() | クラス名::$name | クラス名::name() |
インスタンスメソッド内から | $this->name | $this->name() | self::$name | self::name() |
静的メソッド内から | 無 | 無 | self::$name | self::name() |
クラス名に変数が使えるので注意 $con = new AAA(); は下と同じ
$className = 'AAA';
$con = new $className();
$_SERVER['REQUEST_URI']等はグローバル変数なのでどこへでも書ける(クラスやメソッド内等)
====
可変変数
$test = "aaa";
$var = "test";
echo $$var; //"aaa"が出力
echo ${"test"}; //これも"aaa"が出力
echo ${$var}; //これでも"aaa"が出力
${"name_$test"}
$this->{$test}
$foo->{$start . $end}
$foo->{$arr[1]}
三項演算子
条件式 ? 真の式 : 偽の式
$lang = 'En';
$msg = $lang == 'Jp' ? 'こんにちは' : 'Hello';
print $msg;//Hello
エルビス演算子
条件式(真の式) ?: 偽の式;
条件式がTUREと同等だった場合その値または「1」が返され、FALSEだった場合に偽の式が返されます
$a = 4;
$b = 9;
$num = $a < $b ?: 'aはbより大きい値';
echo $num;//1
NULL合体演算子
条件式または$変数 ?? 式;
条件式または$変数の値が「NULL」のとき式が返り、FALSEのときは条件式または$変数の値が返えされます
条件が存在しなくてもnoticeエラーが出ない
$list = ['a' => 1, 'b' => 2, 'c' => 3];
echo $list['b'] ?? '99'; // 2
echo $list['z'] ?? '99'; // 99
https://www.tomcky.net/entry/2018/02/17/093654
https://qiita.com/ritsuka/items/b4f78ac4121ce5e01173
連想配列はforeach
$preflist = array('Tokyo' => '東京', 'Osaka' => '大阪');
foreach ($preflist as $key => $value){
echo $key . ':' . $value;
}
$fruits = array("Orange","Apple","Berry");
for($i = 0 ; $i < count($fruits); $i++){
echo $fruits[$i];
}
配列を指定した値で埋める
array_fill (インデックス, 要素数, "値");
$ar = array_fill (4, 3, "PHP");
Array ( [4] => PHP [5] => PHP [6] => PHP )
配列の中で最も大きい数値を返します
max( array(100, 200, 300) )
min( 100, 200, 300 )
変数の整数としての値を取得する integer
intval('122.34343The') = 122
平方根/べき乗を取得するには、sqrt()、pow()関数
pow(8, 2) = 64
sqrt( 16 ) = 4
NULLか変数ありか空か
(is_null($val01) ? 'TRUE' : 'FALSE')
(isset($val01) ? 'TRUE' : 'FALSE')
(empty($val01) ? 'TRUE' : 'FALSE')
値の出現回数の総ざらい
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
[1] => 2, [hello] => 2, [world] => 1
asort($A)値で昇順にキー保持しソート、連想配列向き arsot($A, SORT_STRING)降順にソート,文字のモード
sort() / rsort() ソート後にキーが添字配列が付け直される
文字列を配列に変換する
str_split('hel')
[0] => H
[1] => e
[2] => l
配列に追加
$hoge['key2'] = 'value2';
$hoge[] = 'AAA';
array_push($hoge,'CCC','DDD');
array から要素を削除、ループ中のcount()現象に注意
unset($arr[1]);
$arr = array_values($arr);//添字が0から振られ直す
breakはデフォルトでは一番内側のwhile文を抜けて次の処理へ移る
ネストの場合は抜けたい階層の数を指定 break 2;
現在のループ処理を抜けて、次のループ continue;
配列のキー・添字を確認
$ar = array("PHP" => 4, "CGI" => 5);
if(array_key_exists("PHP", $ar)){
配列の値の有無をチェック
$ar = array("PHP", "CGI", "PERL");
if(in_array("PHP", $ar)){
シリアライズ
ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるようにバイトストリームに変換する、これにより配列やオブジェクト等ををデータベースやテキストとして保存したりすることができる、シリアライズ後の文字列は「型:値」の形式に変換されている(string:byte数)
$data=array('key1' => 'value1','key2' => 'value2');
$serial=serialize($data);
var_dump($serial);//string(54) “a:2:{s:4:”key1″;s:6:”value1″;s:4:”key2″;s:6:”value2″;}”
//戻す $data=unserialize($serial);
■ファイルアップロード(のエラー判定)がダメはphp.ini
memory_limit (メモリ使用量の上限)128MB
post_max_size (POSTの最大サイズ ※1回の全upファイルの合計サイズ)8MB->16M
upload_max_filesize (1ファイルあたりの最大アップロードサイズ)2MB->8MB
memory_limit >= post_max_size >= upload_max_filesize > MAX_FILE_SIZE で設定する必要がある
max_execution_time スクリプトの実行時間 30
file_uploads ファイルアップロードが許可されているか On
max_file_uploads 一度にアップロードできるファイル数 20
apacheに「LimitRequestBody」がありデフォ2GB いくらPHP側でそれ以上を設定をした所でHTTPリクエストで駄目(FTPが必要?)
<?php phpinfo(); ?>で確認
php.iniを変更する(通常これ)
htaccessで設定する
httpd.confで設定する
1)<input type="hidden" name="MAX_FILE_SIZE" value="8000000">のタグを埋めハンドリング
超えると$_FILES['userfile']['error']で0以外の確か2が返る
2)アプリ側でも閾値を持ち$_FILES['userfile']['size']でエラーハンドリング、小さめに設定
しかしファイルが大きすぎるとPHPではファイルサイズが0になり不明になるが
$_SERVER['CONTENT_LENGTH']でPostサイズは取れる→(2)で
3)upload_max_filesizeを超えると$_SERVER['CONTENT_LENGTH']でエラーハンドリング
これなら(1)のアプリ制限を持たす必要もないが動的に制限を掛けたい場合に
4)post_max_sizeを超えるとアプリが落ちるので大き目に設定
※下記の考え方は参考になるがコードは間違っている
upload_max_filesize post_max_sizeエラーの対策 CakePHP - watuu's diary (hatenablog.com)
php — PHPの `post_max_size`を超えるファイルを適切に処理する方法は? (it-swarm-ja.tech)
■Javascript
関数宣言>無名関数>ES6 クラス で書き方の変遷
コツ、使用、注意事項をまとめてある
https://www.bangboo.com/cms/blog/page_325.html
■CSSレイアウト
https://www.bangboo.com/cms/blog/page_327.html
Grid 格子状のレイアウト(テーブルレイアウトな感じで)
flexbox 1行の横並び、縦並び
float テキストの回りこみ
https://speakerdeck.com/tonkotsuboy_com/2019nian-madenijian-zhi-siteokitai-cssjavascriptfalseshou-fa
https://qiita.com/kura07/items/e633b35e33e43240d363
https://idotdesign.net/blog/web/htmlcss/css-grid-layout/
http://www.htmq.com/css3/
■CSS
Lightboxなしモーダル https://unicolabo.jp/topics/668.html#overlay
https://www.bangboo.com/reserve/index.php
Formのフォーカスやツールチップ https://www.go-next.co.jp/blog/web/html_css/23603/
Table Trオンマウス https://gray-code.com/html_css/change-style-when-cursor-is-on-table-line-or-cell/
■HTMLタグ
https://qiita.com/kudo_kk/items/b2b1341b2b2543b6fa58
alt属性は画像の代替テキスト
title属性はふきだしチップを表示
/// HTML5
https://www.bangboo.com/cms/blog/page_273.html
■Laravel ララベル
https://coinbaby8.com/laravel-php-dekirukoto.html
https://laravel10.wordpress.com/
ルーティング: URLと対応 .phpで終わせず処理をひとつのファイルやクラスにまとめる
Blade: テンプレートエンジン
ミドルウェア: URL前後に処理を付加
エラーハンドラ: 例外やエラーが発生した際の処理
DI : サービスコンテナというのを用いクラスインスタンスの依存度を極力下げて、実行時に外部から与えてもらえるように
バリデーション: 入力値のチェックを設定のみで自動的に
データベース連携
認証の自動化
インスコ~機能~使い方
https://www.bangboo.com/cms/blog/page_324.html
■IDE/Editor
VS code, Atom, PhpStorm, etc.
HTMLエディタ: Dreamweaver, Brackets etc.
https://hota1024.com/2018/02/19/php%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF5%E9%81%B8/
Visual studio codeにPHP intelephense、PHP Debugを入れる?
DW8の拡張子設定:
C:\Program Files (x86)\Macromedia\Dreamweaver 8\Configuration\DocumentTypes\MMDocumentTypes.xml
https://helpx.adobe.com/jp/dreamweaver/kb/change-add-recognized-file-extensions.html
■Git
https://www.bangboo.com/cms/blog/page_322.html
■XSS対策、CSRF対策、脆弱性チェック
https://www.bangboo.com/cms/blog/page_267.html
Posted by funa : 10:47 PM | Web | Comment (0) | Trackback (0)
January 1, 2016
Posted by funa : 12:00 AM | Gadget | Comment (0) | Trackback (0)
< January 2016 > | ||||||
Sun | Mon | Tue | Wed | Thi | Fri | Sat |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |