/// BANGBOO BLOG ///

  • 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

January 1, 2016

PHP Developer

■スクラム
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::$nameself::name()
静的メソッド内からself::$nameself::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)){

■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/

■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

PHPサイバーテロの技法


■SQL
https://www.bangboo.com/cms/blog/page_151.html
https://www.bangboo.com/cms/blog/page_154.html

■Memcached
KVSでメモリにキャッシュを持たせる
1)Memcached にget
2)キャッシュがない or Memcachedサーバが落ちている場合、DBから取得
3)2の結果をMemcached にset
http://dbinfo.sakura.ne.jp/?contents_id=219

■要件定義、上流工程、PMBOK
https://www.bangboo.com/cms/blog/page_171.html

======================
■今昔
■MySQL
type=でなく ENGINE=InnoDB で
0000-00-00はだめ datetime NOT NULL default '1000-01-01 00:00:00',

twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 10:47 PM | Web | Comment (0) | Trackback (0)


PhotoGallery


TWITTER
Search

Mobile
QR for cellphone  QR for smart phone
For mobile click here
For smart phone click here
Popular Page
#1Web
#2Hiace 200
#3Gadget
#4The beginning of CSSレイアウト
#5Column
#6Web font test
#7Ora Ora Ora Ora Ora
#8Wifi cam
#9みたらし団子
#10Arcade Controller
#11G Suite
#12PC SPEC 2012.8
#13Javascript
#14REMIX DTM DAW - Acid
#15RSS Radio
#16Optimost
#17通話SIM
#18Attachment
#19Summer time blues
#20Enigma
#21Git
#22Warning!! Page Expired.
#23Speaker
#24Darwinian Theory Of Evolution
#25AV首相
#26htaccess mod_rewite
#27/// BANGBOO BLOG /// From 2016-01-01 To 2016-01-31
#28竹書房
#29F☆ck CSS
#30Automobile Inspection
#31No ID
#32Win7 / Win10 Insco
#33Speaker
#34Arcade Controller
#35Agile
#36G Suite
#37Personal Information Privacy Act
#38Europe
#39Warning!! Page Expired.
#40GoogleMap Moblile
#41CSS Selectors
#42MySQL DB Database
#43Ant
#44☆od damnit
#45Teeth Teeth
#46Itinerary with a eurail pass
#47PHP Developer
#48Affiliate
#49/// BANGBOO BLOG /// From 2019-01-01 To 2019-01-31
#50/// BANGBOO BLOG /// From 2019-09-01 To 2019-09-30
#51/// BANGBOO BLOG /// On 2020-03-01
#52/// BANGBOO BLOG /// On 2020-04-01
#53Windows env tips
#54恐慌からの脱出方法
#55MARUTAI
#56A Rainbow Between Clouds‏
#57ER
#58PDF in cellphone with microSD
#59DJ
#60ICOCA
#61Departures
#62Update your home page
#63CSS Grid
#64恐慌からの脱出方法
#65ハチロクカフェ
#66/// BANGBOO BLOG /// On 2016-03-31
#67/// BANGBOO BLOG /// From 2017-02-01 To 2017-02-28
#68/// BANGBOO BLOG /// From 2019-07-01 To 2019-07-31
#69/// BANGBOO BLOG /// From 2019-10-01 To 2019-10-31
#70/// BANGBOO BLOG /// On 2020-01-21
#71Bike
#72Where Hiphop lives!!
#73The team that always wins
#74Tora Tora Tora
#75Blog Ping
#76無料ストレージ
#77jQuery - write less, do more.
#78Adobe Premire6.0 (Guru R.I.P.)
#79PC SPEC 2007.7
#80Google Sitemap
#81Information privacy & antispam law
#82Wifi security camera with solar panel & small battery
#83Hope get back to normal
#84Vice versa
#85ハイエースのメンテ
#86Camoufla
#87α7Ⅱ
#88Jack up Hiace
#89Fucking tire
#90Big D
#914 Pole Plug
#925-year-old shit
#93Emancipation Proclamation
#94Windows env tips
#95Meritocracy
#96Focus zone
#97Raspberry Pi
#98Mind Control
#99Interview
#100Branding Excellent
Category
Recent Entry
Trackback
Comment
Archive
<     October 2020     >
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
Link