アロー演算子についてわかりやすく教えてください

このQ&Aのポイント
  • アロー演算子を使う時は、クラス内の変数などにアクセスする際に使用します。普通はクラスを使わない場合は、アロー演算子は使用しません。
  • 他のファイルから呼び出す場合は、require_onceなどを使用してからアロー演算子で呼び出します。
  • PDOもrequire_onceなどで呼び出してから使用します。
回答を見る
  • ベストアンサー

アロー演算子について

php素人です アロー演算子についてわかりやすく教えてください クラスとか使ったことありませんのでアロー演算子をみるとパソコンの前から逃げ出したくなります 質問1 アロー演算子を使うときはクラス内の変数などにアクセスするときだけですか?(普通はclassを使わない場合、アロー演算子は使わないのですか?) 質問2 他のファイルから呼び出す場合はrequire_onceなどをつかってからアロー演算子でよびだすのですか? 質問3 PDOもrequire_onceなどで呼び出してからつかってるのですか? 質問4 下記のようにclassを定義する前にnewでオブジェクトを出現させても大丈夫なんですか? 質問5 アロー演算子とはクラスから変数や関数を使うためのものですか?下記の場合、 $hoge変数にclass numberdayoの処理が詰まっているってことでしょうか? $hoge = new numberdayo(); $hoge ->number = 2; $hoge ->numberdayo(); class numberdayo{ public $number; function numberdayo(){ print($this -> number); } } 質問6 別の質問ですが、classをつかってない単なる関数functionは定義する前に呼び出せますか? hoge(); function hoge(){ print("関数"); } よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

回答1 クラスのプロパティ・メソッドへの静的アクセス 「::」 HogeClass::$hoge; HogeClass::hoge(); オブジェクト(クラスのインスタンス)のプロパティ・メソッドへの動的アクセス 「->」 $obj = new HogeClass; $obj->hoge; $obj->hoge(); 回答2 他のファイルにクラスが定義されている場合はrequire_onceでの呼び出しが必要です。 オートローディングという手法もあります。 http://php.net/manual/ja/language.oop5.autoload.php 回答3 PDOクラスはC言語レベルでコーディングされたエクステンションです。 コードが読み込まれる前にすでに使える状態となっています。 回答4・回答6 ifブロックの中で定義されている場合を除き、後ろに定義を書いていても前で使うことが出来ます。 ただし分かりにくくなるのでお勧めはしません。 回答5 >> 変数や関数 「プロパティやメソッド」が正しい呼び名です。 >> $hoge変数にclass numberdayoの処理が詰まっているってことでしょうか? 「static」とついているもの以外の内容が詰まっています。 それらには「->」でアクセスできます。 「static」なものに関しては回答1で述べたようにクラス名に対して直接「::」でアクセスします。 なお >> function numberdayo() { >>  print($this->number); >> } よりも public function numberdayo() {  print($this->number); } とちゃんと「public」を頭につけたほうが望ましいでしょう。 省略はもちろん「public」を意味するんですが。 またクラス構成として、インスタンスを作った後に$numberを外部から変更されたくなければ class numberdayo {  private $number;  public function __construct($number) {   $this->number = $number;  }  public function numberdayo() {   print($this->number);  } } $hoge = new numberdayo(2); $hoge->numberdayo(); として「コンストラクタ」で代入を行い、プロパティ自体は「private」にして外部からのアクセスを遮断するのがポイントになります。

flash0
質問者

お礼

回答ありがとうございます 一歩前にすすめました

関連するQ&A

  • 可変変数にアロー演算子を使いたい

    例えば、 /** $hoge->appale1 は 10 $hoge->appale2 は 20 $hoge->appale3 は 30 */ このように定義されていたとします。 それを可変変数で for( $k=1; $k<=3; $k++ ){  $dynamicName = 'hoge->appele' . $k;  print "apple{$k}は" . $$dynamicName . 'です'; } のように出力したいのですが、アロー演算子を含んだ可変変数だと$hoge->apple1の数値を出力してくれません。 どのように記述すればいいでしょうか? また、可変変数で不可能であれば代案でも結構です。 お分かりになる方、ご回答お願いいたします。

    • ベストアンサー
    • PHP
  • スコープ演算子について

    php素人です スコープ演算子についておしえてください 質問1 スコープ演算子を使えばclass内の変数を下記のような書き方で取得できますか? 質問2 スコープ演算子を使うとアロー演算子でオブジェクトを作成するよりプログラムの負荷の軽減になるのですか? 質問3 アロー演算子を使わずにスコープ演算子を使ったほうがいいのでしょうか? 質問4 スコープ演算子のデメリットはありますか? class Message { public $number=1; function hello() { return "こんにちは"; } } $number = Message::$number; $message1 = Message::hello(); よろしくお願いします

    • ベストアンサー
    • PHP
  • require_onceについて

    いつもお世話になっております。 超初級な質問で申し訳ないのですが困ってます。 下記のような4つのclassがあります。 A_Class------------ <?php require_once('Base_Class'); class A_Class extends Base_Class{} Base_Class------------------ <?php require_once('B_Class'); abstract class Base_Class { public function hoge (){ $b = new B_Class(); $b->hoge(); } } B_Class--------------------- <?php require_once('C_Class'); class B_Class{ public function hoge (){ $c = new C_Class(); } } C_Class--------------------- <?php require_once('Base_Class'); class C_Class extends Base_Class{} ほかのファイルからrequire_once('A_Class');をすると PHP Fatal error: Class 'Base_Class' not found in C_Class.class.php on line 2 となります。 Base_Classのrequire_once('B_Class');をクラス定義の下に書けば通るのですが、 できればrequire_onceは上部にそろえておきたいです。 require_onceを下に書かずに修正する方法がありましたらご教授お願いします。

    • 締切済み
    • PHP
  • 実体化したクラスを関数の引数にするには

    タイトルの通りです。 実体化したクラスを関数の引数として渡し、 関数の中でクラスのメソッドを実行したいと思っています。 以下のソースではエラーが出るのですが、 お分かりの方はいらっしゃいますでしょうか? $o_hoge = new Class_hoge(); fncHoge = ($o_hoge); function fncHoge($class) {  $class->hoge('test'); } class Class_hoge {  public function hoge($a)  {   print $a;  } }

    • ベストアンサー
    • PHP
  • php クラス

    クラスの勉強をしているのですが、 記憶寿命をfunctionの中で完結させsample2以降でも同じ変数などを使えるようにするため定義済み関数内でクラスを処理したいのですが下記のエラーが出てしまいます。 functionの中でクラスを簡潔させるにはどのようにすればよいでしょうか?また、これはなぜエラーが起きているのでしょうか? function sample1(){ $pr=new parson; $pr->name="鈴木"; $pr->age=56; print $pr->getname(); print $pr->getage(); class parson { public $name="鈴木"; public $age=56; function getname(){return $this->name;} function getage(){return $this->age;} }} sample1(); Fatal error: Uncaught Error: Class 'parson' not found in hoge/class.php:11 Stack trace: #0 /hoge/class.php(27): sample1() #1 {main} thrown in /hoge/class.php on line 11

    • ベストアンサー
    • PHP
  • ダブルコロンとアロー演算子

    ダブルコロンとアロー演算子は共に関数の呼び出しと認識しているのですが、具体的にどこが違うのでしょうか? 初心者質問で恐縮ですが、宜しくお願いします。

  • 比較演算子===と!==について

    PHP初心者です。 まず、===と!==が型が同じかどうかを比較する演算子だという事は調べて分かりました。 問題は以下のソースコードに関してです。 <?php class foo { public $a = 3; } class hoge { public $a = 3; } //真偽を文字列に変換する関数 function trueOrFalse($comp) { return $comp? 'true':'false'; } //4つの比較演算子を用いた比較の結果の表示 function compareObject($var1, $var2) { print('$var1 == $var2 --'.trueOrFalse($var1 == $var2)."\n"); print('$var1 != $var2 --'.trueOrFalse($var1 != $var2)."\n"); print('$var1 === $var2 --'.trueOrFalse($var1 === $var2)."\n"); print('$var1 !== $var2 --'.trueOrFalse($var1 !== $var2)."\n"); } //オブジェクトの生成 $f0 = new foo(); $f1 = new foo(); //$f0を代入、$f2は、$f0と同じオブジェクトを指す $f2 = $f0; $h0 = new hoge(); //結果の表示 print("同じクラス、プロパティが同じ\n"); compareObject($f0, $f1); print("同じオブジェクトを参照\n"); compareObject($f0, $f2); print("異なるクラス、プロパティは同じ\n"); compareObject($f0, $h0); ?> この結果分からないのは$f0と$f1の比較で===はfalseに!==はtrueになる事です。 型が違うとは一体どういう事なのでしょうか。 また、付け足す形になりますが、$f0と$h0の比較についても分かりません。 値は両方3です。 なのに==はfalseに!=はtrueになります。 これはどうしてでしょうか。 アドバイスどうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • C++ の new演算子について

    C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント     の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。

  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • function「文」と「演算子」の違い

    下記は、リンク先の分類でいくと、 「function 文」「function 演算子」 何れに該当するのでしょうか? var hoge = function f() { alert(1); }; hoge(); https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope ・無名関数でないから、「function 文」? ・あるいは、「var hoge = 」に入れているから、「function 演算子」? ・もしくは、「function 文」でもあり、「function 演算子」でもある? >同じ構文を持っています ・と書いているから、そもそも両者に違いはない?

専門家に質問してみよう