
はじめに
オブジェクト指向プログラミングの入門書では、
class cat {
function mew() {
return "ニャー";
}
function hasNekomimi() {
return TRUE;
}
}
// kitten is a cat.
class kitten extends cat {
function mew() {
return "ミー";
}
// hasNekomimiメソッドは、catクラスから継承される
}
// phpはダックタイピングなので、catクラスのかわりに渡せる
class catgirl {
function mew() {
return "にゃんっ";
}
function hasNekomimi() {
return TRUE;
}
}
これは一見わかりやすく思えますが、
オブジェクト指向の基礎
まず、
#! /usr/local/bin/php
<?php
$url = "http://192.168.0.100/";
class rail {
var $number;
function rail($number = "00") {
$this->number = $number;
}
function drive($speed = 0) {
global $url;
if ($speed >= 0)
$command = substr("ABCDEF", min($speed, 5), 1);
else
$command = substr("abcdef", min(-$speed, 5), 1);
file_get_contents($url."?".$this->number."=".$command);
}
function sense() {
global $url;
return file_get_contents($url."?".$this->number."=S") + 0;
}
}
#
# |---r4---|---r3---|---r2---|---r1---|---r0---|
#
$r0 =& new rail("00");
$r1 =& new rail("01");
$r2 =& new rail("02");
$r3 =& new rail("03");
$r4 =& new rail("04");
for (;;) {
$r0->drive(2);
$r1->drive(3);
$r2->drive(3);
$r3->drive(2);
while ($r4->sense() == 0)
;
$r0->drive(0);
$r1->drive(0);
$r2->drive(0);
$r3->drive(0);
$r4->drive(-2);
$r3->drive(-3);
$r2->drive(-3);
$r1->drive(-2);
while ($r0->sense() == 0)
;
$r4->drive(0);
$r3->drive(0);
$r2->drive(0);
$r1->drive(0);
}
?>
「class rail {」
- (1)
あらかじめ 「$r0 =& new rail("00");」 としておきます。"00"はレールの番号です。 - (2)
「$r0->drive(3);」 とすると、 レールに電圧がかかります。数字が大きいと、 スピードも速くなります。ゼロだと停止で、 マイナスだと逆方向になります。 - (3)
「$r0->sense();」 とすると、 レールに車両があれば1、 なければ0が返ります。
これにより、
さて、
継承
たとえば、
こんなときオブジェクト指向では、
class revrail extends rail {
function drive($speed) {
parent::drive(-$speed);
}
}
短いわりにはわかりにくいリストですが、
使い方は簡単で、
呼び出し方もrailクラスのときと同じです。
これを応用すると、
なお、
同時走行
説明が長くなってしまいました。では、


ポイントで大きいループと小さいループが切り替わるようになっています。それぞれの車両が、

プログラムはリスト4のようになりました。
#! /usr/local/bin/php
<?php
$url = "http://192.168.0.100/";
class rail {
var $number;
function rail($number = "00") {
$this->number = $number;
}
function drive($speed = 0) {
global $url;
if ($speed >= 0)
$command = substr("ABCDEF", min($speed, 5), 1);
else
$command = substr("abcdef", min(-$speed, 5), 1);
file_get_contents($url."?".$this->number."=".$command);
}
function sense() {
global $url;
return file_get_contents($url."?".$this->number."=S") + 0;
}
}
class revrail extends rail {
function drive($speed = 0) {
parent::drive(-$speed);
}
}
class point {
var $number, $number2;
var $fork = -1;
function point($number = null, $number2 = null) {
$this->number = $number;
$this->number2 = $number2;
}
function fork($fork = 0) {
global $url;
if ($fork == $this->fork)
return; # not change
$this->fork = $fork;
if ($this->number !== null)
file_get_contents($url."?".$this->number."=".(($fork)? "P" : "p"));
if ($this->number2 !== null)
file_get_contents($url."?".$this->number2."=".(($fork)? "P" : "p"));
}
}
#
# -------|---r0---+ -3 <--> +3
# +--------|---r4---<p0 |
# | | |
# +---r5---|--------<p0 |
# --r1---|--------+ +3 <--> -3
#
$r0 =& new revrail("00");
$r1 =& new rail("01");
$r4 =& new revrail("04");
$r5 =& new rail("05");
$p0 =& new point("02", "03");
for (;;) {
#
# >>>>>>>|---r0---+
# +--------|>>>r4>>><p0 |
# | | |
# +---r5---|<<<<<<<<<p0 |
# <<r1<<<|--------+
#
$p0->fork(0);
$r1->drive(3);
$r4->drive(3);
sleep(5); # make sure of leaving $r5
while ($r0->sense() == 0)
;
while ($r5->sense() == 0)
;
$r1->drive(0);
$r4->drive(0);
sleep(5); # wait in station
#
# -------|---r0---+
# +>>>>>>>>|---r4---<p0 |
# | | |
# +<<<r5<<<|--------<p0 |
# --r1---|--------+
#
$p0->fork(1);
$r5->drive(3);
sleep(5); # make sure of leaving $r4
while ($r4->sense() == 0)
;
$r5->drive(0);
sleep(5); # wait in station
#
# -------|>>>r0>>>+
# +--------|>>>r4>>><p0 |
# | | |
# +---r5---|<<<<<<<<<p0 |
# --r1---|<<<<<<<<+
#
$p0->fork(1);
$r0->drive(3);
$r4->drive(3);
sleep(5); # make sure of leaving $r5
while ($r1->sense() == 0)
;
while ($r5->sense() == 0)
;
$r0->drive(0);
$r4->drive(0);
sleep(5); # wait in station
#
# -------|---r0---+
# +>>>>>>>>|---r4---<p0 |
# | | |
# +<<<r5<<<|--------<p0 |
# --r1---|--------+
#
$p0->fork(0);
$r5->drive(3);
sleep(5); # make sure of leaving $r4
while ($r4->sense() == 0)
;
$r5->drive(0);
sleep(5); # wait in station
}
?>
ここではポイントもクラスにしてみました。ポイントは2つを対で動かすことが多いので、
今回も実行結果を動画で見てみましょう。
次回は、