PHP

WEBサイト作成

連想配列に関数リテラルを格納してオブジェクトを生成


関数、メソッド、イベント、トリガーの違い

関数は用途や場所によって呼称が変わりますが、連想配列の中に変数の値が格納されるのと同じように、関数も無名関数として連想配列に格納され、同じようにキー(リテラル)で管理される場合はメソッドと呼ばれ、その配列自身を実体化(オブジェクト化)します。

  • 関数は処理のカタマリで、外のプログラムから呼び出して使うことができるものであり、呼び出すときに引数を渡して処理させたり、戻り値を返してもらうことができます。
  • メソッドはオブジェクト内でのみ有効なオブジェクト自身に対する操作を行なうもので、オブジェクト関数またはメンバ関数と言い換えられます。
  • イベント(ハンドラ)は、ドラッグやドロップなどの画面上での処理のタイミングで発生させる関数であり、画面上での処理対象であるDOM要素そのものをuiオブジェクトとして引数で渡し、イベント(ハンドラ)内で処理を行ないます。
  • これとは別にトリガーは、テーブルに対する追加、更新、削除といったDB更新時のタイミングで、自動的にDBが起動させる特殊なストアドプロシージャで、SQL Server(T-SQL)やOracle(PL/SQL)によって、データの管理を自動化するために用いられます。

配列リテラル

PHPの場合

PHPは変数に値を格納した時点で利用できるようになります。

arrayは関数のように使用しますが、実際には関数ではなくPHPの言語構造の1つであり、配列を初期化する機能を持ちます。

1.配列に直接値(リテラル)を入れていくと自動的にインデックス(番号キー)が振られる。
$name[]='あ';
$name[]='い';

print $name[0];   //「あ」を表示
print $name[1];   //「い」を表示

2.キーを数字(インデックス)にして値を入れる。
$name[0]='あ';
$name[1]='い';

print $name[0];   //「あ」を表示
print $name[1];   //「い」を表示

3.キーを文字列にして値を入れる。
$name['a']='あ';
$name['i']='い';

print $name['a'];   //「あ」を表示
print $name['i'];   //「い」を表示

4.PHPの言語構造(関数みたいなもの)であるarrayの引数として値を入れると自動的にインデックスが振られる。
$name=array('あ', 'い');

print $name[0];   //「あ」を表示
print $name[1];   //「い」を表示

5.arrayの引数に「キー=>値」のカンマ区切り形式で、キー指定で値を入れる。
$name=array('a'=>'あ', 'i'=>'い');

print $name['a'];   //「あ」を表示
print $name['i'];   //「い」を表示

JavaScriptの場合

JavaScriptでは変数は、varを使って明示的に定義する必要があります。

1.配列として定義した変数に直接値を入れていくと自動的にインデックスが振られる。
var name = [];
name[]='あ';
name[]='い';

document.write(name[0]);  //「あ」を表示
document.write(name[1]);  //「い」を表示

2.キーを数字(インデックス)にして値を入れる。
var name = [];
name[0]='あ';
name[1]='い';

document.write(name[0]);  //「あ」を表示
document.write(name[1]);  //「い」を表示

3.キーを文字列にして値を入れる。
var name = [];
name['a']='あ';
name['i']='い';

document.write(name['a']);  //「あ」を表示
document.write(name['i']);  //「い」を表示

4.arrayを使って値を入れると自動的にインデックスが振られる。
var name=array['あ', 'い'];

document.write(name[0]);  //「あ」を表示
document.write(name[1]);  //「い」を表示

5.arrayを使ってキー指定で値を入れる。
var name=array{'a':'あ', 'i':'い'};

document.write(name['a']);  //「あ」を表示
document.write(name['i']);  //「い」を表示

JavaScriptの場合、new演算子で空の配列オブジェクトを作成してから値を代入する方法もあります。

var name = new array();
name[0]='あ';
name[1]='い';

document.write(name[0]);  //「あ」を表示
document.write(name[1]);  //「い」を表示

関数リテラル

PHPとJavaScriptの関数の作り方はほぼ同じ書式です。

PHPの場合

<form action="" method="post">
    <input name="num" type="text" />
    <input name="send" type="submit" />
</form>

<?php 
if(isset($_POST['send'])){
    print sumNum($_POST["num"]);    //関数呼び出し

} 

function sumNum(n){ 
    $sum=0;
    for($i=0; $i<=$num; $i++){
        $sum += $i;
        return $sum;
    } 
} 
?>

JavaScriptの場合

<script>
var angka=prompt("Input number");
alert(sumNum(angka));    //関数呼び出し

function sumNum(n){
    var sum=0;
    for(var i=0; i<=n; i++){
        sum += i;
        return sum;
    }
}
</script>

このJavaScriptの関数は、関数リテラルを使って無名関数を値として変数に代入し、変数を呼び出すことで関数を実行できます。

<script>
var angka=prompt("Input number");
var result=sumNum(angka);    //関数リテラル呼び出し
alert(result);

//関数リテラル
var sumNum=function(n){
    var sum=0;
    for(var i=0; i<=n; i++){
        sum += i;
        return sum;
    }
}
</script>

連想配列に関数リテラルを格納しオブジェクト生成

以上までがウォーミングアップでここからが本題ですが、JavaScriptの連想配列には関数リテラル(無名関数)を格納することもできます。

まあ関数リテラルは値なので、当たり前と言われればそれまでなんですけど、大事なのは「連想配列を作る=オブジェクトを作る」ということです。

<script>
//配列変数の定義
var name=new Array();

//リテラルを格納
name['a']='あ';
name['i']='い';
name['sumNum']=function(){
    var sum=0;
    for(var i=0; i&lt;=n; i++){
        sum += i;
        var result=sum+name['a']+name['i'];
        alert(result);
    } 
} 

//関数の呼び出し
name['sumNum']();
</script>

で、連想配列は以下のようにオブジェクトのプロパティまたはオブジェクトのメソッドっぽく書くこともでき、この場合は配列変数もオブジェクト変数に変えます。

<script>
//オブジェクト変数の定義
var name=new Object();

//プロパティに値を格納
name.a='あ';
name.i='い';
name.sumNum=function(){
    var sum=0;
    for(var i=0; i&lt;=n; i++){
        sum += i;
        var result=sum+name.a+name.i;
        alert(result);
    }
}

//関数の呼び出し
name.sumNum();
</script>

オブジェクト指向を意識しなくとも、JavaScriptは関数ベースで十分使えるわけですが、連想配列に関数リテラルを入れることこそJavaScriptのオブジェクト指向の真骨頂であり、配列とオブジェクトの関係は以下のように対応します。

  1. 数値やテキストを格納してキーで管理するものがプロパティ
  2. 関数リテラルを格納してキーで管理するものがメソッド
  3. 連想配列を実体化したものがオブジェクト

関数リテラルは無名関数(関数名なし)であり、無名関数を変数に代入すると、変数名で関数を呼び出すことができます。

オブジェクトリテラル

配列がキーまたはインデックスで管理され、同じ型の値のみ格納するのに対し、オブジェクトは複数の異なる型の値をまとめてプロパティで管理するものであり、オブジェクトリテラルは「プロパティ名:値」の形式で並べて記述します。

//オブジェクトリテラルを定義
var p = {
    font-size: 16px;
    line-height: 30px;
    margin-bottom: 20px;
}

//CSSはセレクタのオブジェクトリテラル
p {
    font-size: 16px;
    line-height: 30px;
    margin-bottom: 20px;
}

JSON形式はオブジェクトリテラルと同じように、キーと値をコロン区切りで記述しますが、複数要素の終わりはセミコロン区切りではなくカンマ区切りになります。

//jQueryのJSON形式
$('.target').droppable({
	accept:'.box',
	hoverClass:'hover',
	tolerance: 'fit',
	drop:function(event,ui){
		//dropしたときにui.draggableが設定され、.boxをクローンとして自分の子要素としてくっつける
		ui.draggable.clone().appendTo(this);
		console.log('dropped');
	}
})

DOM構築後に実行するjQuery関数の中に、要素オブジェクトのメソッドを定義し、メソッドの動き方をキーにイベントを代入する、という動きをJSON形式で定義します。

//1. jQuery関数を定義
//$(document).ready(function($){
//$(document).ready(function(){
//jQuery(function($){
//jQuery(function(){
//$(function($){
$(function(){
	//2.1 #box要素(オブジェクト)をにメソッドを定義(ドラッグ可能にする)。
	$('#box').draggable();

	//2.2 メソッドにJSON形式でプロパティ(キー)と値(リテラル)を渡す
	$('#box').draggable ({
		 opacity:0.5
	});

	//3. メソッドにJSON形式でプロパティ(キー)と値(関数リテラル)を渡す
        //   イベントにはオブジェクトを引数で渡す(ドラッグ中に座標を表示する)
	$('#box').draggable ({
		 opacity:0.5,
		 drag: function(event, ui){
			  console.log(ui.position.left);
		 }
	});
});

PHPとJavaScriptのオブジェクト生成方法

PHPでメソッド(メンバ関数)を実行するには、クラスをnew演算子で実体化(オブジェクト作成)する必要がありますが、その際の引数をクラス内のメンバ変数にセット(初期化)するためにコンストラクタを使います。

class Person{
  //メンバ変数の定義
  private $name;

  //コンストラクタ関数でメンバ変数$nameを初期化(クラス外の引数をクラス内のメンバ変数にセット)
  function __construct($parm){
    $this->name = $parm;
  }
  //クラスの実行メソッド
  public function konnichiwa(){
    print('こんにちは'.$this->name);
  }
}



//クラスのオブジェクトの生成
$hito = new Person('yama');

//クラスのメソッドの実行
$hito->konnichiwa();

PHPではnew演算子でクラスを実体化しますが、JavaScriptにはクラスという概念はありませんので、コンストラクタ関数に引数を渡して、new演算子を使うことにより、プロパティやメソッドを装備したオブジェクトを生成することができます。

//コンストラクタ関数
Function Person(name){

    //変数に引数をセット
    this.name = name;

    //変数にメンバ関数をセット
    this.konnichiwa = function(){
        alert('こんにちは' + this.name);
    }
}

//コンストラクタ関数を元にnew演算子でオブジェクトを生成
var hito = new Person('yama');

//オブジェクトのメンバ関数の実行
hito.konnichiwa();

JavaScriptにはクラスという概念がないので、関数オブジェクトはメソッドではなくメンバ関数と呼ぶほうが適切かもしれません。





おすすめ記事一覧

大統領選挙で考えたギャップにハマるということ 1

ギャップにキュンとするというのは人間の本能みたいなもので、ジョコウィの私利私欲のない素朴なおじさん像と、その実強力なリーダーシップを発揮する実務派という内面が、一見普通の人だが実はスゴイというギャップ好きのインドネシア人に大ウケして、大衆は一種の集団催眠状態にあるようです。

情報の質のレベル 2

見える化された結果を共有化することで問題点が共通認識されますが、共有化が進むことで情報の持つ希少価値が薄れて困る人間がいる場合、有益な情報を独占することでポジションを高めようという政治力が働きます。

インドネシアのスタバの店員にありがたい人生の教訓を教わった件 3

いつものスタバでいつものアイスコーヒーを注文していると、だいたいなじみの店員が「今日は珍しい時間に来たねー」とか「今日もいつものアイスでいいのかなー」とか馴れ馴れしくフレンドリーに話しかけてきます。

宗教によって異なる「死んだらどうなる」の考え方 4

キリスト教もイスラム教もともにユダヤ教から派生した宗教であり、それぞれイエス・キリスト(本人が神)またはアッラーという唯一無二の神を信じます。

株価操作なんてインドネシア株では当たり前 5

株価は売り注文と買い注文により変動し、大量の売り注文を買う注文がたくさん入れば、他の投資家達は「俺も俺も」と続くことで株価が上がります。

心臓に毛が生えたインドネシア人のずうずうしい転職活動を応援してみた 6

インドネシア人は秘密の話は誰かに暴露しないと精神の安定を保てない人が多いため、内緒の話に情報の希少性は少なく信憑性も低いことが多いので、「ここだけの話」という枕詞付きで聞かされる話は話半分に聞いておいたほうがいいかもしれません。

日系企業のインドネシアでの存在意義 7

今のまま日本の人口減が続けば、内需は縮小の一途をたどるわけで、そうなると日本国内市場だけで生き残るのは難しいと判断する国内企業が、海外市場に活路を見出そうとするのは必然です。

チャンスはあるが勝てる分野を見つけるのが難しい 8

実際にインドネシアに住んでみて、自分で動いて人と話しをして、現地の事情を少しずつ理解していくにつれて、インドネシアで起業することが意外と手強いことに気づき、その難しさの原因は、高い送料と関税であったりローカル企業との競争であったり、就労ビザ(IMTA)や外国人技能開発基金(DPKK)などのランニングコストの高さであったりします。

インドネシアのシステムインテグレーション業界 9

先日JETRO(日本貿易振興機構)さんと、インドネシアの中小企業のIT投資について意見交換させていただく機会をいただいたのですが、そこで「システム投資のコストメリットはどのように説明できるのか」という、システムインテグレーターの存在価値にも関わる重要な問題提起がありました。

肉体と精神と心と魂 10

「Body and Soul」といえば、昨日の内閣改造に伴う人事で内閣府政務官に内定した自民党の今井絵理子参議院員がメンバーだったSPEEDのデビュー曲であり、インドネシアの老舗女性ファッションブランド名でもあります。

ジャカルタのラーメン市場 11

僕がインドネシアに初めて来たのが1997年10月、インドネシア語は分からないし、仕事は辛いし、周囲の人間は理不尽だし、一時期日本に帰りたくて仕方がない時期がありましたが、当時自分をかろうじてインドネシアに繋ぎ止める心の支えとなっていたのが、協栄プリンスビル(今のWisma Keiai)の日本食レストラン「五右衛門」であり、ここでキムチラーメンを食べることが唯一の楽しみと言っても過言ではありませんでした。

ブランド力、技術力、資金力の3要素 12

1998年のジャカルタ暴動後、ルピアが暴落し海外からのドル建て債務を抱えた国内企業が利子の支払いに苦しんでいた頃、僕は外貨が獲得できるインドネシアでの新しいビジネスを探していました。

日本とインドネシアの間でのタイムマシン経営が通じなくなっている件 13

先進国と後進国との間にある流行のタイムラグを利用して、先進国での成功例を後進国で実践するビジネスモデルをタイムマシン経営といいますが、インターネットの普及に伴い情報がフラット化してしまい、モノと情報のタイムラグが限りなく小さくなった今、先駆者である中小零細同業他社が乱立し市場が出来上がったところに、後発の大手が参入し先発零細を駆逐していく、という典型的な負けパターンにはまります。

サリナデパートとマクドナルド 14

本日5月10日を最後にインドネシアのマクドナルド第1号店であるサリナデパート店(Sarinah)が閉店になりますが、ジャカルタのショッピングモールが新しいコンセプトでモダンにリニューアルされ続ける中で、僕がインドネシアに来たばかりの20数年前には、若者の待ち合わせ場所の定番でもあったサリナデパートやブロックMのパサラヤ(Pasaraya)などは完全に時代に取り残されてしまいました。

不景気の歴史 15

僕がインドネシアに来てからこれまで何度か経済不況を見てきましたが、今回の新型コロナウィルスの感染拡大により、間違いなく景気後退しますので、数年後にはこれがコロナショックとかコロナ不況とか呼ばれるようになるのかもしれません。

日本のバブル経済崩壊後とインドネシアの通貨危機後 16

自分が大学に入学したのがバブル経済末期の1991年、土地も株価もMAX爆上げして、三菱地所がアメリカの象徴であるロックフェラーセンタービルを買収し、ジュリアナ東京でワンレンボディコン(登美丘高校ダンス部のバブリーダンスみたいなやつ)のお姉さん達が扇子振って踊っている時期でした。

内需と外需の自国経済に及ぼす影響 17

公共事業投資を行っても、お金が企業内や個人の貯蓄に滞留してしまい国内消費が増えないのが日本の状況であり、国内消費は増えても消費材の輸入品比率が高く、国内資産が海外に流出しているのがインドネシアの状況です。

2019年の総選挙を前にインドネシア政治史のおさらい 18

来年の大統領選挙(Pemilu Pilpres Pileg Indonesia 2019)に向けての選挙運動(Kampanye)を解禁するにあたり、投票用紙に印字される順番はジョコウィ現職大統領・マフル副大統領候補組が1番、プラボウォ大統領候補・サンディアガウノ副大統領候補組が2番と決まりました。

コーヒーをもっと楽しくもっと美味しく 19

インドネシアは北回帰線と南回帰線をはさむコーヒーベルトに位置するコーヒー栽培に適した国で、1602年の東インド会社の進出を契機にオランダの植民地支配が300年以上続き、その間アラビカ種のコーヒーが持ち込まれ、気候のいい高原地帯で栽培が開始されました。

インドネシア人の悪魔祓い 20

人間誰しも自分の中に悪魔が潜んでおり、それが何らかのきっかけで表面に出て来るという考え方自体には、背景に宗教が有るか無いかの違いだけで、基本的に理解できる話であり、それを信じるか信じないかは別として、そういう考えがあることを認めることは大切なことだと思います。

-WEBサイト作成

© 2020 バテラハイシステム Powered by STINGER