プロが教える店舗&オフィスのセキュリティ対策術

最近PerlからPHPに乗り換えました。
Perlでは共通関数の外部ファイルを作成して、どのプログラムもそれを読み込むようにしていました。

PHPでも同じように行いたいと思っています。
仮にcommon.phpという共通関数のプログラムを作成したとします。
ここで疑問に思ったのですが、各パッケージそれぞれがcommon.phpを読み込んだ場合、やはり読み込んだ数分だけメモリが消費されるのでしょうか?

common.phpがclassで定義されていて、requireで参照した場合common.phpの内容をメモリに振り分けられるのは読み込んだときなのかnewした時なのかご存知の方いらっしゃいますでしょうか?



つまり、perlではグローバル変数(関数?)として読み込んでいたのですが、PHPではそれができず(できてもグローバル化はやりたくは無い)のでコレを実現させるためには各関数ごとに読み込まなくてはいけないのかどうか迷ってしまいました。


アドバイスをいただければと思い書き込ませて頂きました。

よろしくお願いします。

A 回答 (2件)

require、includeを複数回したら複数回処理されますから、


外部ファイルがクラスだろうがなんだろうが、
読み込んだ時点で多少なりとも毎回メモリ消費はあるのではないでしょうか。
試しに外部ファイルを2度連続してincludeしてみてはいかがでしょうか。

【call.php】
<?php
include("common.php");
include("common.php");
?>

【common.php】
<?php
print("test");
?>

require_once、include_onceを複数回行った場合、
一番最初以外は処理を行いませんので、
メモリ消費は一番最初だけだと思います。

【call.php】
<?php
include_once("common.php");
include_once("common.php");
?>

【common.php】
<?php
print("test");
?>

勿論インスタンスを生成した時点でもメモリ消費はあるでしょうね。
複数インスタンスを持つのにメモリ消費が1度きりとは考え難いです。

つまり、「外部ファイルを利用する為の消費」と
「オブジェクトを利用する為の消費」なんだと思います。

が、私的見解なので、真偽の程は分かりません。

> つまり、perlではグローバル変数
この文章以降が、良くわかりませんが、以下のようにして
クラスオブジェクトを外側のプログラムで利用したくないという事でしょうか?
(以下だとcommonファイルをクラス化しちゃってます)

【class.php】
<?php
class newClass {
private $num;

public function __construct() {
$num = 0;
}

public function add($num) {
$this->num += $num;
}

public function getnum() {
return $this->num;

}
}
?>

【common.php】
<?php
class common {
private $obj;

public function __construct() {
include("class.php");
$this->obj = new newClass();
}

public function test() {
$num = 5;
$this->obj->add(10);
$num += $this->obj->getnum();
return $num;
}
}
?>

【call.php】
<?php
include("common.php");

$common = new common();
print($common->test());
?>

PHP4だと呼べますけどねきっと・・・。
    • good
    • 0
この回答へのお礼

とてもご丁寧にありがとうございます。

例えば膨大なプログラムを作成し、それをincludeで読み込んだ場合、使う時までその膨大なプログラムをメモリに展開するのかどうかが気になりました。
ですが、わざと構文を間違えて実行したところエラーが出てしまったので、おっしゃる通り読み込んだ時点ですべて展開しているようですね。

教えていただいたように、クラスのTOPに共通のオブジェクト(?)として読み込ませると、いちいち関数ごとに同じものを読み込まなくてもできるんですね!使ってみます。

ありがとうございました。大変参考になりました。

お礼日時:2006/05/11 10:38

質問内容が難しく回答の意味が合っているか分かりませんが.....



基本的にPHP関数においてrequire関数とinclude関数は同一の処理を行います。

主にinclude関数は下記の場合に使用します。
・複数プログラムで共有する関数をまとめておく。
・プログラム内で変更する可能性の多い箇所を外部に出しておく。

include関数の動作としては宣言したタイミングで呼び出し側プログラムにincludeファイルが組み込まれると考えた方が良いでしょう.....

変数について私が使用している方法は全ての関数で一つの配列を使用しています。
下記の例のようにすれば変数の受け渡しに無理が無くグローバル変数を使用しなくてもOKだと思います。
例)
<?
$common['a']='a';
$common['b']='b';
$common['c']='c';

kansu($common);
exit;

function kansu($common){
print "$common['a']<br>";
print "$common['b']<br>";
print "$common['b']<br>";
}
?>

長々となってしまいましたが回答内容は合っているでしょうか!?

参考URL:http://jp.php.net/manual/ja/function.include.php
    • good
    • 0
この回答へのお礼

ありがとうございます。

なるほど。ファイルが分かれていてもincludeで呼び出すのであれば結局は1つのプログラムで作ったと同じ事なのですね。

今までグローバル変数に頼ったプログラムの書き方をしていたので例にあげていただいたプログラムを応用させて頑張ってみたいと思います。

ありがとうございました。

お礼日時:2006/05/09 10:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!