最近PerlからPHPに乗り換えました。
Perlでは共通関数の外部ファイルを作成して、どのプログラムもそれを読み込むようにしていました。
PHPでも同じように行いたいと思っています。
仮にcommon.phpという共通関数のプログラムを作成したとします。
ここで疑問に思ったのですが、各パッケージそれぞれがcommon.phpを読み込んだ場合、やはり読み込んだ数分だけメモリが消費されるのでしょうか?
common.phpがclassで定義されていて、requireで参照した場合common.phpの内容をメモリに振り分けられるのは読み込んだときなのかnewした時なのかご存知の方いらっしゃいますでしょうか?
つまり、perlではグローバル変数(関数?)として読み込んでいたのですが、PHPではそれができず(できてもグローバル化はやりたくは無い)のでコレを実現させるためには各関数ごとに読み込まなくてはいけないのかどうか迷ってしまいました。
アドバイスをいただければと思い書き込ませて頂きました。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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だと呼べますけどねきっと・・・。
とてもご丁寧にありがとうございます。
例えば膨大なプログラムを作成し、それをincludeで読み込んだ場合、使う時までその膨大なプログラムをメモリに展開するのかどうかが気になりました。
ですが、わざと構文を間違えて実行したところエラーが出てしまったので、おっしゃる通り読み込んだ時点ですべて展開しているようですね。
教えていただいたように、クラスのTOPに共通のオブジェクト(?)として読み込ませると、いちいち関数ごとに同じものを読み込まなくてもできるんですね!使ってみます。
ありがとうございました。大変参考になりました。
No.1
- 回答日時:
質問内容が難しく回答の意味が合っているか分かりませんが.....
基本的に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
ありがとうございます。
なるほど。ファイルが分かれていてもincludeで呼び出すのであれば結局は1つのプログラムで作ったと同じ事なのですね。
今までグローバル変数に頼ったプログラムの書き方をしていたので例にあげていただいたプログラムを応用させて頑張ってみたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- その他(プログラミング・Web制作) HTMLを組み込むことができない言語 3 2022/05/21 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
こちらはただの直列処理ですか?
-
シェルスクリプトからphpファイ...
-
別ファイルの変数を呼び出した...
-
別PHPファイルに変数を渡す
-
入力フォームの空白や改行を制...
-
phpのソースコードが、そのまま...
-
phpのプログラムエラー
-
#!/usr/local/bin/phpはどこに...
-
MySQLの配置が変わったため、db...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
form actionで二つ送信先を指定...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
存在しないメールアドレスかど...
-
.htaccessにphp_valueが使用できな
-
PHP8を使うと、大量のWarningが...
-
PHPでfatal errorが出ても無視...
-
アップロード画像数でCSSを分け...
-
Apacheでhttp://localhost/が表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの変数を呼び出した...
-
MySQLの配置が変わったため、db...
-
入力フォームの空白や改行を制...
-
別PHPファイルに変数を渡す
-
シェルスクリプトからphpファイ...
-
phpのソースコードが、そのまま...
-
include先でのinclude元の変数...
-
phpinfo.phpを開くとファイルの...
-
拡張子php画像をbmp画像等に変...
-
PHPから別なPHPへ移動(?)する方法
-
PerlからPHPの呼び出しについて
-
1行目の#! "C:\\xampp\\php\\p...
-
ローカルでは動くがサーバーで...
-
PHPの拡張子を見せない方法
-
パスワード等が記述されているp...
-
#!/usr/local/bin/phpはどこに...
-
.htaccessの設定で,auto_prepe...
-
PHP(.php)及びJavascrpit(.j...
-
.phpのファイルを開けない!
-
拡張子なしのファイルを稼働さ...
おすすめ情報