2013年10月5日土曜日

Underscore.jsのメソッドまとめ

_.shuffle() : 配列をシャッフル

_.each() : 要素のそれぞれに処理を行う


            _.each ([2, 5, 8], function(num) {
                console.log(num*2);
             });
配列のそれぞれの要素がfunctionの引数に入ってきて処理を行う


_.map() : 要素のそれぞれに処理を行って、returnしたものを配列として返す
            x = _.map ([2, 5, 8], function(num) {
                 return num*2;
             });
           
x = [4, 10, 8]という風に返ってくる

find : 条件に最初に合うものを探して返す


              var a = [2, 5, 8, 42, 12];
              var x;
 
              x = _.find(a, function(num) {
                  return num > 5;
              });
    //aの各要素がnumに入って、num>5ならその値をxに入れて終了。
     最初に条件に一致したものを返す


filter :条件に合うもの全てを配列として返す、挙動はほぼfindとおなじ。
contains : 配列にある値があるかないかを判定する


            var a = [2, 5, 8, 42, 12];
              var x;
 
              x = _.contains(a, 8);

配列aに8という要素があればtrueなければfalseを返す

groupBy : 条件に併せてグルーピングして配列で返す

x = _.groupBy(a, function(num) {
return num % 3;
});
この場合だと3でわって余りが1のグループ、2のグループ、0のグループ
の配列を返す

countBy : 条件ごとに要素数をカウント

x = _.countBy(a, function(num){
  return num % 2 == 0 ? 'even' : 'odd';});条件に合う要素数をevenとして、合わない元をoddとして返す

sortBy:演算結果の大きさでソートする

x = _.sortBy(a, function(num) {
return Math.sin(num);
});

この場合は各要素のsin値の大きさでソートして配列を返す
x = _.sortBy(["me", "i", "and"], 'length');
このようにプロパティーを第二引数にとってそのプロパティーでソートする

集合演算子計

var a = [1, 2, 5];
var b = [5, 2, 8];
var x;
_.union : 複数の配列の重複を削除して和集合をとる

 x = _.union(a, b);
結果はx = [1, 2, 5, 8]

_.intersection : 共通部部分を探す

x = _.intersection(a, b);
結果はx = [2, 5]

_.difference : 差分を求める(第二引数の要素には無い第一引数の要素)
x = _.difference(a, b);


_.uniq:重複がないものだけ引っ張ってくる
x = _.uniq([2, 5, 2, 10, 5]);
結果はx = [2, 5, 10]

オブジェクトに関する関数

var x;
var user = {
 name: 'hotondo',
 score: 80,
 web: 'http://hotondo-kojin.com'
};

_.keys : オブジェクトのキーを返してくれる
x = _.keys(user);
結果
x = [name, score, web]

_.values : オブジェクトの値のみとってくる
x = _.values(user);

_.invert : value とkeyを逆転する
x = _.invert(user);

_.has : keyを持つか判定
x = _.has(user, "name");
結果
x = true;

あとはisEmptyとかisString, isNull, isNumberとかもある

生成系

_.range([start], stop, [step]) : startからstopまでの連続し配列を生成、stepに値をいれると飛び飛びになる

_.range(10); 
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

_.range(1, 11); 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

_.random([max]):[max]までの数字でランダムな数字を生成

_.escape(”文字列”) : 文字列を実体参照した形で表示する

_.times(回数, function()) : 関数の処理を回数分行う

_(回数).times(function()):処理される内容は”_.times(回数, function())”

繋げて書くことが出来るメソッド

_.chain(”処理対象”).メソッド.メソッド.メソッド.value() : このようにchainとvalueの間に複数のメソッドをつないで処理することができる

テンプレート機能
_.template:テンプレートを作成してその中にオブジェクトを当て込む機能です
var x;
var user = {
 name: 'hotondo',
 score: 80,
 web: 'http://hotondo-kojin.com'
};
var tpl = "<% console.log('hello from tpl'); %><li><%- name %> (<%- score %>)</li>";
x = _.template(tpl, user);
こうすることでtplのなかのnameとscoreにuserのオブジェクトが代入された形で出力されます。
代入する際に使われる括りが3種類あって
<% %> :内部にjavascriptの命令を書き込める
<%- %> :値をそのまま出力
<%= %> :値をエスケープして出力

2013年10月4日金曜日

haml メモ

属性の付け方
%html{:lang => "ja"}
%meta(charset="UTF-8")
の2種類がある

コメントの書き方
htmlにも反映される書き方 : /
htmlには反映されない書き方: -#
 *字下げすればコメントでくくられるので複数行かけるよ

属性の書き方いろいろ
<div class="myClass" id="main"></div>
と表示させたい場合


  1. %div{:id => "main", :class => "myClass"}
  2. %div(id="main" class="myClass")
  3. %div#main.myClass

上の1〜3どれでも同じように出力される

フィルターいろいろ

  • :css
  • :javascript
  • :escaped

  1. :css
  2. .myStyle {
  3. color: red;
  4. }
のように
:フィルター名
の後にインデントを下げて普通に内容を書けば
:cssなら<style>, :javascriptなら<script>, :escapedなら実体参照で出力される

Rubyの表現
#{}
カッコの中身ではルビーを実行できる、その結果がテキストとして出力される

%p total is #{5 * 3}
結果
<p>total is 15</p>

=
イコールの後にルビーの命令を入力することもできる
%p= Time.now
結果
<p>2012-11-14 19:47:53 +0900</p>

-
ただ単にルビーを実行したいときに使う
- (1..10).each do |i|
%p{:id => "item_#{i}"} #{i}

結果
<p id="item_1">1</p>
<p id="item_2">2</p>
<p id="item_3">3</p>
<p id="item_4">4</p>
<p id="item_5">5</p>
<p id="item_6">6</p>
<p id="item_7">7</p>
<p id="item_8">8</p>
<p id="item_9">9</p>
<p id="item_10">10</p>



2013年7月17日水曜日

PHPで学ぶ「集合知プログラミング」〜最適化〜 3

今回は学生寮の最適化問題をPHPで書いてみます。
まずは$dormsと$prefで学生寮のリストと各学生の希望のリストを作ります


$dorms = array('Zeus', 'Athena', 'Hercules', 'Bacchus', 'Plute');
$prefs = array(array('Toby', array('Bacchus', 'Hercules')), array('Steve', array('Zeus', 'Plute')), array('Andrea', array('Athena', 'Zeus')),array('Sarah', array('Zeus', 'Plute')), array('Dave', array('Athena', 'Baccus')), array('Jeff', array('Hercules', 'Plute')), array('Fred',  array('Hercules', 'Plute')), array('Suzie', array('Bacchus', 'Hercules')), array('Laura', array('Bacchus', 'Hercules')), array('Neil', array('Hercules', 'Athena')));

学生に寮を割り当てるたびに寮の候補が減っていくので
今回の$domainは順番に範囲が狭くなるように設定しています


$domain = array();
var_dump($prefs);
for ($i = 0; $i <count($dorms) * 2; $i++) {
    $domain[] = array(0, count($dorms)*2 -1 - $i);
}

各生徒への寮の割り当て配列$vecが与えられた時に寮の割り当て表を出力する関数を定義します。


function printsolution($vec, $dorms, $prefs) {
    $slots = array();
    for ( $i = 0; $i<count($dorms); $i++) {
        $slots[] = $i;
        $slots[] = $i;
    }

    for($i = 0; $i < count($vec); $i++) {
        $x = $vec[$i];
        $dorm = $dorms[$slots[$x]];
        echo $prefs[$i][0] . ',' . $dorm . '<br>';
        array_slice($slots, $x, 1);
    }
}
$vec = array(0,0,0,0,0,0,0,0,0,0);
var_dump(printsolution($vec, $dorms, $prefs));

寮の割り当てに対するコスト関数の定義を行います。


function dormcost($vec, $dorms, $prefs){
    $cost = 0;
    $slots = array(0,0,1,1,2,2,3,3,4,4);

    for($i = 0; $i < count($vec); $i++) {
        $x = $vec[$i];
        $dorm = $dorms[$slots[$x]];
        $pref = $prefs[$i][1];
        if($pref[0] == $dorm) {
            $cost = $cost + 0;
        } elseif($pref[1] == $dorm) {
            $cost = $cost + 1;
        } else {
            $cost = $cost + 3;
        }
        array_slice($slots, $x, 1);
    }
    return $cost;
}

ランダムオプティマイゼーションで寮の割り当て問題の最適化をしてみます。


function dormcostrandomoptimize($domain, $dorms, $prefs) {
    $best = 999999999;
    $bestr = 'null';
    for($i = 0; $i < 10000; $i++) {
        $r = array();
        for($s = 0; $s < count($domain); $s++) {
            $r[] = rand($domain[$s][0], $domain[$s][1]);
        }
        $cost = dormcost($r, $dorms, $prefs);

        if ($cost < $best) {
            $best = $cost;
            $bestr = $r;
        }
    }
    return $bestr;
}

$s = dormcostrandomoptimize($domain, $dorms, $prefs);
var_dump(dormcost($s, $dorms, $prefs));
var_dump(printsolution($s, $dorms, $prefs));

2013年7月15日月曜日

PHPで学ぶ「集合知プログラミング」〜最適化〜 2

ランダムサーチによる最小コストの旅程を求める関数。
コスト関数を入れ替えれば旅程以外の問題でも最小、最大をランダムサーチによって求めることができる。

ヒルクライムによる最小コストを求める関数。
コスト関数を入れ替えれば、他の問題においても最小、最大値を求めることができる。

擬似アニーリングによる最適化関数。
ここでは、旅程のコストの最適値を求めているが、コスト関数を入れ替えれば他の問題にも適用できます。

遺伝アルゴリズムを用いた最適化関数。
ここでは旅程問題の最小コストの最適化を試みていますが、他の問題にも応用できます。
かなり強力なアルゴリズムなのでオススメです。
肌感としては、世代数を増やすよりも人口(ポピュレーション)を増やしたほうが良い解に辿り着ける可能性が高い気がします。
遺伝的アルゴリズムはpythonコードをphp化するのに苦労しました。
もとのpythonコードにミスがあったので苦戦していたのですが、<『集合知プログラミング』 解体新書/a>が非常に参考になりました。

2013年7月14日日曜日

PHPで学ぶ「集合知プログラミング」〜最適化〜 1

グループ旅行問題を特にあたり$peopleのarrayに人名と出発地を入れる。
そして、全ての人達の目的地としてLGAを設定する。
サンプルのフライトデータとしてhttp://kiwitobes.com/optimize/schedule.txtが用意されているのでダウンロードして同じディレクトリに入れておく。
そして、schedule.txtからoriginとdestをキーとしたフライトリストを作る。
さらに、HH:MMの形式で表された時間を午前0時0分から何分経ったかに変換するgetminutes関数を定義する

誰がどの便でLGAにやってくるかを$sで表現する。
各数字はその日の何便目に乗るか。そして、Seymourの行き・帰り・Frannyの行き・帰り・・・の順に並んでいる。
この数列から各人の旅程の情報を出力する関数を定義する(printschedule)

コスト関数の定義。運賃総額と空港での待ち時間、レンタカーの追加料金を含めたコストを旅程ごとに算出する関数を定義する。

2013年7月13日土曜日

PHPで学ぶ「集合知プログラミング」〜推薦を行う〜 2

transformPrefsでスコアのディクショナリをアイテムごとのディクショナリに変換して
アイテムごとにループを回して各アイテムに似ているアイテムをランキングでとってくる
各ユーザーの評価で映画のタイトルのスコアに重みづけをしてアイテムベースでユーザーにオススメをする
MovieLensのデータ・セットを使って商品の推薦を行います。

まず、loadMovieLens関数でMovieLensのデータをロードします。そして、getRecommendations関数を使ってユーザーベースの推薦を行い、
calculateSimilarItems関数を使ってアイテム間の相関を計算し、getRecommendedItems関数でアイテムベースの推薦を行います。

とここまで「集合知プログラミング」の2章をPHPで書きなおして来たわけですが、
実際にアイテムベースで推薦を行う場合のロジックはどのようなものなのでしょうか?
まず、アイテムベースの推薦で使っている関数は
calculateSimilarItems
transformPrefs
topMatches
sim_peason( or sim_distance)
でやっていることといえば
まず、ユーザーごとの各アイテムの評価のarrayをアイテムごとのユーザーによる評価のarrayに変換しています。
つまり、arrayの第一連想配列のキーはアイテム名で、第二連想配列のキーは評価者となります。
そして、sim_peasonを使ってアイテム間の相関スコアを取得します。
そのアイテムスコアを使ってtopMaches関数で各アイテムごとに、相関スコアが高い順にアイテムをランキング付けします。
たとえば、Superman Returnsに一番相関が高いのはYou Me and Dupreeでスコアは0.657
二番目に高いのはLady in the Waterでスコアは0.487といった具合です。
ここまでで、どのアイテムとどのアイテムが似ているのかがわかるようになったわけです。
最後にユーザーに対して推薦を行う場合は
ユーザーが既に評価した(購入した)アイテムとまだ購入していないアイテムの相関スコアに対して
評価したアイテムの評価で重み付けを行い、まだ購入していないアイテムそれぞれの推薦度スコアを計算します
そして推薦度スコアがもっとも高いものをユーザーに推薦します。
この章では一旦、ユーザーベースの推薦を行ったあとに、そのロジックを逆転させてアイテムベースの推薦を行っているので
どういうロジックでアイテムベースの推薦を行っているのかを理解するのがすこし難しいですね

2013年7月12日金曜日

PHPで学ぶ「集合知プログラミング」〜推薦を行う〜 1

「集合知プログラミング」 買いました!
データのシミュレーションや分析には興味があったので
といっても
ただ、エクセルで表とかグラフとか作るだけじゃつまんない
エンジニアとして
どや!!って言える仕事がしたい
なので、集合知プログラミングでエンジニアっぽい分析を習得しようと思います

この集合知プログラミングはPythonで書かれております。
僕は主にPHPを使って開発をしていますし
というか、PHPしかつかってないし。。
ただ単にPythonを写経するだけだと何にも身につかないと思うので
サンプルコードをPHPで書き直しながら進めていきたいと思っています。 

まずはデータ・セットの作成 二人の評価者のユークリッド距離によるスコアを算出するsim_distanceとピアソン相関によるスコアを算出するsim_peasonを定義
リストの中から最も好みの似ている評価者を選び出すtopMatchesを定義。
var_dump($result)でTobyに似ているユーザーをarrayで返してくれる 評価者に重み付けを行い(自身とどの程度好みが似ているか)
その重みづけスコアと書く評価者の評価点を掛けあわせて映画のタイトルごとにスコアを算出する
もっともスコアの高い映画が、対象とするユーザーにオススメの映画となる
今まで用いてきた評価者ごとの映画の評価配列を映画ごとの評価配列に変換する
以前に定義したtopMatches関数を使って、似た属性をもつ映画をランキング形式で表示できる。
また、映画が誰に見られるべきかをgetRecommendationsを使って表示することができる

2013年2月18日月曜日

UNIX 特定の文字列を含むファイルを検索

find . | xargs grep "探したい文字列"

このコマンドで検索できます。

find . I ←これは大文字のアイなのでご注意ください

2013年2月13日水曜日

ドットインストール phpの基礎(応用編)




データベースへの接続


 今回はMySQLに接続する方法を紹介

 練習用のデータベースを作成
       $ mysql -u root -p

mysql> create database データベース名(今回はTable_in_blog_app
mysql> use データベース名(今回はTable_in_blog_app) 
mysql> create table users(
  -> id int(11) not null auto_increment primary key,
  -> name varchar(50),
  -> email varchar(255),
  -> password varchar(16)
  -> );

 作業ユーザーも設定しておきましょう

mysql> grant all on データベース名(今回はTable_in_blog_app.* to 作業ユーザー名(今回はdbuser005)@localhost identified by 'パスワード'

 try - catch
  トライ以降の命令をやってみてダメだったらキャッチ以降の命令をやりなさいという意味

<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
                                  //dbhはデータベースハンドラのこと、
         //PDOmysqlに接続する方法
         //ここの書き方はお決まりです。
         //ここでデータベースへの接続を試みている

}catch(PDOException $e){                         //エラーが発生した時には
            var_dump($e -> getMessage());   //エラーの内容を取得
            exit;                                                                            //処理を終了
}

echo "success";                     //うまく行ったらサクセスと表示
$dbh = null;              //接続を終了

MySQLに接続してデータを取ってくる方法


<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理
//全てのユーザーを取得して表示する
$sql = 'select * from users';
$stmt = $dbh->query($sql);//データベースハンドラにquery(sql文の変数)をいれると実行してくれる
foreach ($stmt ->fetchAll(PDO::FETCH_ASSOC) as $user){
            //実行した結果は$stmtfetchAllでとってこれる
            //引数にPDO::FETCH_ASSOCとすると連想配列的にとってきてくれる
            //foreachで一つ一つをユーザーとしてまわしていく
            var_dump($user['name']);
}
            //件数を表示
echo $dbh -> query("select count(*) from users")->fetchColumn(). "records found";
            //fetchColumn()queryを表示
            //切断
            //count()の間にスペースを入れると表示されないので注意
$dbh = null;


データを挿入してみよう!


== 例1 ==
<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理 プリペアードステートメントを使う
// prepare()の中にsql文を書く
//valueははてなにしておく、

$stmt= $dbh ->prepare("insert into users (name, email, password) values (?, ?, ?)");
//?にはいる値を配列でexecuteに与える
//プリペアードステートメントはエスケープ処理を自動でやってくれる
$stmt ->execute(array("n", "e", "p"));

echo "done";

            //切断
$dbh = null;

== 例2 value(?, ?, ?)じゃわかりにくいという場合==

<?php

try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e -> getMessage());
            exit;
}

//処理 プリペアードステートメントを使う
// prepare()の中にsql文を書く
//valueははてなにしておく、
$stmt= $dbh ->prepare("insert into users (name, email, password) values (:name, :email, :password)");
//(name, email, password)にはいる値を連想配列的にexecuteに与える
//プリペアードステートメントはエスケープ処理を自動でやってくれる
$stmt ->execute(array(":name" =>"n2", ":email"=>"e2", ":password"=>"p2"));

echo "done";

            //切断
$dbh = null;

プリペアードステートメントの違った書き方


<?php

//データベースへの接続
try{
            $dbh = new
            PDO('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e->getMessage());
            exit;
}

//処理
$stmt =$dbh->prepare("insert into テーブル名(フィールド名1, フィールド名2, フィールド名3) values(:フィールド名1, :フィールド名2, :フィールド名3)");
//フィールド名プレースフォルダーを変数に当てはめてる
$stmt ->bindParam(":フィールド名1", $変数1);
$stmt ->bindParam(":フィールド名2", $変数2);
$stmt ->bindParam(":フィールド名3", $変数3);

//変数に値を入れていく
$変数1 = "n10";
$変数2  = "e10";
$変数3  = "p10";
//変数を代入したプレースフォルダーが挿入される
//executeと引数なし
$stmt -> execute();

//変数1以外は変更なしに挿入される
$変数1  ="n10x";

$stmt ->execute();
//インサートされたレコードのIDを知りたい
echo $dbh->lastInsertID();

echo "dune";

//切断
$dbh = null;

データの更新と削除の仕方



<?php
try{
            $dbh = new PDO
            ('mysql:host=localhost;dbname=データベース名', 'ユーザー名', 'パスワード');
}catch(PDOException $e){
            var_dump($e ->getMassate());
            exit;
}
//名前がnから始まる人たちのEメールアドレスをダミーに変える
$stmt = $dbh -> prepare("update users set email = :email where name like :name");
//"n%"nから始まるという意味
//update users set email = :email were name like :nameこれはname:nameで指定した形の場合はemail:emailで指定した値にしなさいということ

$stmt -> execute(array(":email" =>"dummy", ":name"=>"n%"));

//パスワードがp10のものを全て削除
//delete form users where password = :passwordとは:passwordが指定した値のもののユーザーを削除しなさい
$stmt = $dbh -> prepare("delete form users where password = :password");
$stmt -> execute(array(":password" =>"p10"));
//削除されたかを表示
echo $stmt ->rowCount() ."records deleted";
echo "done";


Cookieを設定してみよう!

<?php

//Cookie(ブラウザにデータを保存)
setcookie("クッキーの名前","クッキーの値","有効期限");

setcookie('userName', 'taguchi', time()+60*60*24*14);//2週間
setcookie('userName', '', time()-60)//有効期限マイナスにするとクッキーを削除するという命令

//このようにアクセスできる
//複数のページで使い回したいデータがあった場合に便利
echo $_COOKIE['userName'];

セッションを使ってみよう

<?php

//セッション(サーバー側にデータを保存するという仕組み)

session_start();//セッションを使うおまじない

$_SESSION['セッション変数'] = "セッションの値";//これでセッション変数に値をセット
unset($_SESSION['セッション変数']);//セッション変数を削除
echo $_SESSION['セッション変数'];// これでセッション変数の中身が表示される

クラスを使ってみよう


//オブジェクト指向
ユーザーに関するデータや関数をまとめて管理する為の考え方
/*

クラス : 設計図(どういった変数関数があるのかみたいな)
 - メンバー変数
 - メソッド(関数)(何らかの処理を行おう)
 - コンストラクタ(初期化処理、特殊なメドッド)

 インスタンス: クラスを実体化したもの(設計図を実体化)



*/
<?php
//userというクラスを作る
class User{
            //メンバー変数を定義
            public $name;//publicはどこからでもあくせすされてOK
            public $email;//publicではなくprivateにするとclassの外からはアクセスできない
           
            //実体化する時にnameemailを渡されるとすると
            //コンストラクと
            //__constructで出てくるname, emailは上で出てきたname emailとは違う
           
public function __construct($name, $email){//インスタンスかされる時に呼ばれるn引数
                        $this->name = $name; //thisをつけるとclassないでその変数にアクセスできる
                        $this->email= $email;
}


//メソッドを作れる
public function sayHi(){
            echo "hi! my name is" .$this->name;
}
}
//実体化newを使う
//同じようなやり方でいくらでもインスタンスを作れる
//こうするとtomさんやbomさんに設定した変数や関数が使えるようになる
$tom = new User("tom", "dummy@dummy.com");
$bom = new User("bom", "dummy`dummybob.com");
//トムさんの名前を表示
echo $tom->name;
//tom,bomさんのsayHiを表示
echo $tom->sayHi();
echo $bom->sayHi();

クラスの継承

Userというクラスを拡張する

<?php

class User{
            public $name;
            public $email;
           
            public function __construct($name, $email){
                        $this->name = $name;
                        $this->email= $email;
            }
           
            public function sayHi(){
                        echo "Nice to meet you".$this->name;
            }
}
//Userを拡張してSuperUserを作る
//Userのメンバー変数ファンクションメソッドを引き継いで上書きしたり別のメソッドを作ったりできる
class SuperUser extends User{
           
            public function superSayHi(){
                        echo "Hiii! my name is".$this->name;
            }
}
           
            //bomさんはSuperUserを使えるようにする
            $tom = new User("tom", "tomutomu@tomu.org");
            $bom = new SuperUser("bom", "bombom@bommm.org");
           
//$bomさんはSuperUserなのでSupserSayHi()が使える

echo $bom->SuperSayHi();

長くなってきた時にファイルを分割する方法

同じフォルだにclass.phpというファイルを作って
ーーーーーここからーーーーーー
class User{
            public $user;
            public $name;
           
            public function __construct($user, $name){
                        $this->user = $user;
                        $this->name = $name;
            }
            public function sayHi(){
                        echo "Nice to meet you".$this->name;
            }
}
class SuperUser extends User{
            public function superSayHi(){
                        echo "Hiii! my name is".$this->name;
            }
}
ーーーーーここまでーーーーーー
はりつけて、頭に<?phpと書く
こうした外部ファイルはrequire_once('ファイル名')で読み込む
ちなみに

require('..');エラーで強制停止、その都度読み込む
require_once('...'); エラーで強制停止一回だけ読み込んでほしい時につかう

include('...');エラーで警告、その都度読み込む
include_once('...'); エラーで警告、一回だけ読み込む


で、index.phpには以下のようにかいておくと分割されたclassが読み込まれて実行される
<?php
require_once('class.php');


            $tom = new User("tom", "tomutomu@tomu.org");
            $bom = new SuperUser("bom", "bombom@bommm.org");
           
//$bomさんはSuperUserなのでSupserSayHi()が使える


echo $bom->SuperSayHi();