PHPでインターフェイスと抽象クラスの違いについて
インターフェイスと抽象クラスについて教えていただいたので、メモ
【インターフェイス】
・複数の異なるクラスに共通の機能を実装するための実態の定義
・インターフェイスを実装したメソッドはインターフェイス上で定義されている
メソッドを実装しなければならない
・メソッドの内容は定義できない
・複数のインターフェイスをクラスへ実装することができる
【抽象クラス(abstract)】
・共通の機能を抽象的に定義し、子クラスで特有の機能を実装する
・抽象クラスで定義されたabstractメソッドは子クラスで実装しなければならない
・abstractをつけないで実装込みのメソッドを定義することができる
・抽象クラスはインスタンスすることが出来ず、継承した子クラスをインスタンスする
必要がある
これだとインターフェイス要らないんじゃないかと思った。しかし
・車抽象クラス
<?php
abstract class Car {
//アクセルを踏む
abstract public function accelerator();
//ブレーキを踏む
abstract public function brake();
//ハンドルを左に切る
abstract public function turn_left();
//ハンドルを右に切る
abstract public function turn_right();
//ギアを上げる
abstract public function gear_up();
//ギアを下げる
abstract public function gear_down();
}
こんな感じのcarクラスがあったとする
マニュアル車の場合はこれで問題ないかもしれないけれど、
オートマ車の場合にギアの操作がいらないじゃないかと
・AT車クラス
class AtCar extends Car {
//アクセルを踏む
public function accelerator() {
// TODO: Implement accelerator() method.
}
//ブレーキを踏む
public function brake() {
// TODO: Implement brake() method.
}
//ハンドルを左に切る
public function turn_left() {
// TODO: Implement turn_left() method.
}
//ハンドルを右に切る
public function turn_right() {
// TODO: Implement turn_right() method.
}
//ギアを上げる
public function gear_up() {
// TODO: Implement gear_up() method.
}
//ギアを下げる
public function gear_down() {
// TODO: Implement gear_down() method.
}
}
こんな感じで実装しなければならない
$AtCar = new AtCar();
//AT車なのでギア操作がないけど呼べちゃう
$AtCar->gear_up();
の様な矛盾が起こる、バグの元、危ない
そこでインターフェイスを使ってみる
・車部品インターフェイス
//速度操作インターフェイス
interface speed {
//アクセルを踏む
public function accelerator();
//ブレーキを踏む
public function brake();
}
//進行方向操作インターフェイス
interface direction {
//ハンドルを左に切る
public function turn_left();
//ハンドルを右に切る
public function turn_right();
}
//ギア操作インターフェイス
interface gear {
//ギアを上げる
public function gear_up();
//ギアを下げる
public function gear_down();
}
・AT車クラス
class AtCar implements speed, direction {
//アクセルを踏む
public function accelerator() {
// TODO: Implement accelerator() method.
}
//ブレーキを踏む
public function brake() {
// TODO: Implement brake() method.
}
//ハンドルを左に切る
public function turn_left() {
// TODO: Implement turn_left() method.
}
//ハンドルを右に切る
public function turn_right() {
// TODO: Implement turn_right() method.
}
}
ギア操作メソッドなしでOK
MT車クラスを作成する時はgearインターフェイスをimplementsすればOK
なるほどと思った。
本番サーバ上のwordpressをローカル(開発)へ移行
本番サーバ上のwordpressをローカル(開発)へ移行します。
本番サーバ上のDBのdumpを持ってきただけだとなんかバグってるんで
s22:"http://本番環境のアドレス"←本番
s16:"http://localhost"←こうしたい(開発)
手作業でやるのはしんどいので以下のツールを使います。
1.これをダウンロードして開発サーバに置きます。
2.本番のdumpをそのまま開発へ入れます。
3.ダウンロードしたphpファイルにアクセス
4.開発環境に合わせて設定を入力します。
5.終わり
javascriptでtableの列と行を固定
<input id="addRow" type="button" value="行追加">
<div style="height: 500px; width:1000px; overflow-y:scroll;">
<table id="test_table" style="table-layout: fixed;" border=1 width="1000" height="500" _fixedhead="rows:1; cols:1">
<thead>
<tr>
<?php
for ($i = 1; $i <= 50; $i++) {
echo "<th width='100'>カラム".$i."</th>";
}
?>
</tr>
</thead>
<tbody>
<?php
for ($i = 1; $i <= 50; $i++) {
echo "<tr>";
for ($j = 1; $j <= 50; $j++) {
echo "<td>データ" . $j . "-" . $i . "</td>";
}
echo "</tr>";
}
?>
</tbody>
</table>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="fixed_midashi.js"></script>
<script type="text/javascript">
$(function(){
//テーブル固定
FixedMidashi.create();
//行追加クリック
$("#addRow").click(function(){
var rowhtml = "<tr>";
for (var i=1; i <= 50; i++) {
rowhtml += "<td>追加" + i + "</td>";
}
rowhtml += "</tr>";
$('#test_table').append(rowhtml);
FixedMidashi.create();
});
});
</script>
めんどくさかったので一個にまとめました。
tableのスタイルを固定してfixedMidashiというライブラリを使いました。
画面描画後に
FixedMidashi.create();
を実行します。
行追加後にも実行します。