質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1621閲覧

phpのインスタンス化について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/06/27 17:28

お世話になります、
表題についてですが、下記コードでインスタンス化をした際に、$aaaと$bbbはそれぞれ独立性をもって、出力結果が
//Test1::testCall1
//Test1::testCall2
//Test1::testCall1
//Test1::testCall2
となると期待したのですが間違いでした。
厳密にはインスタンス化をすると、newするたびにヒープ内にそれぞれのメモリ領域を確保するので上記の結果になると思ったのですが。

Javaを最近勉強していたので、phpのこの挙動には違和感を感じました(Javaの場合はインスタンス同士が独立している)。この点phpはハード面からどのような挙動をし、こういった出力結果になっているのでしょうか。
宜しくお願い致します。

php

1<?php 2 3 class Test1{ 4 public function testCall(){ 5 static $num = 0; 6 $num++; 7 echo __METHOD__ . $num . "<br>"; 8 } 9 } 10 11 $aaa = new Test1(); 12 $bbb = new Test1(); 13 14 $aaa->testCall(); 15 $aaa->testCall(); 16 $bbb->testCall(); 17 $bbb->testCall(); 18 19// 出力結果 20//Test1::testCall1 21//Test1::testCall2 22//Test1::testCall3 23//Test1::testCall4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

えーと、staticがついてるからだと思いますが、期待するような処理はこうかな

PHP

1<?php 2 3class Test1{ 4 5 private $num = 0; 6 7 public function testCall(){ 8 $this->num++; 9 echo __METHOD__ . $this->num . "<br>"; 10 } 11} 12 13$aaa = new Test1(); 14$bbb = new Test1(); 15 16$aaa->testCall(); 17$aaa->testCall(); 18$bbb->testCall(); 19$bbb->testCall(); 20 21?> 22

結果
Test1::testCall1
Test1::testCall2
Test1::testCall1
Test1::testCall2

Javaで、質問と同じ処理を書くと、、、メソッドの中にstaticは書けないようなので、こんな感じかな

Java

1public class Test1 { 2 3 static int num; 4 5 public static void main(String[] args) { 6 Test1 aaa = new Test1(); 7 Test1 bbb = new Test1(); 8 aaa.testCall(); 9 aaa.testCall(); 10 bbb.testCall(); 11 bbb.testCall(); 12 } 13 14 void testCall() { 15 num++; 16 System.out.println("Test::testCall" + num); 17 } 18 19}

結果
Test::testCall1
Test::testCall2
Test::testCall3
Test::testCall4

書き方は多少違いますが、static は、インスタンスごとで独立しないということだけ分かれば、それほど難しいことではないと思います。

スタティック変数、スタティックメソッド、インスタンスメソッド、インスタンス変数について理解して、それぞれ確認してみると似たようなものなので、それほど違和感もなくなってくるかと思います。

いろいろ実験するのはいいことですね^^

投稿2016/06/27 22:41

編集2016/06/28 01:46
Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/28 04:07

ありがとうございましたーーー!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問