ホームページ > バックエンド開発 > PHPチュートリアル > アドバイスを求めてください! PHP オブジェクト指向学習ソリューション

アドバイスを求めてください! PHP オブジェクト指向学習ソリューション

WBOY
リリース: 2016-06-13 13:18:43
オリジナル
868 人が閲覧しました

アドバイスを求めてください! PHP オブジェクト指向の学習
最近、PHP オブジェクト指向プログラミングを学習する過程でいくつかの問題に遭遇しました。専門家に答えてもらいたいと思います。

1. クラス内で静的変数を使用すると、リソースの使用量を削減できます。では、どのような状況で静的変数を使用する必要があるのでしょうか?グローバル変数との類似点と相違点は何ですか? ~(これは私を非常に混乱させます)。

2. クラスの定数。クラスで定義された定数と非クラスで定義された定数の利点と欠点は何ですか? ~定数を定義する必要があるのはどのような状況ですか? ~

3. 学べる PHP のオブジェクト指向のサンプルはありますか? ~「はい」の場合、関連リンクを提供してください。 (基礎的な学習ではなく、少し踏み込んだ授業例です)


では、皆さん、ありがとうございました。 ! !

-----解決策---------
《PHP 高度なプログラミング: パターン、フレームワークとテスト(HD中国語PDF版)》
http://www.verycd.com/topics/2783113/
------解決策------------------
クラス内の静的変数、静的変数を使用すると、リソースの使用量を削減できます。では、どのような状況で静的変数を使用する必要があるのでしょうか?グローバル変数との類似点と相違点は何ですか?

リソースの使用量は削減できますか?

私の理解は (2 つの側面で):
0 です。クラスの静的変数は、(クラスに属する) 「クラス自体の静的変数」と、クラス メソッドの静的変数に分けられます。 (クラスに属しますが、定義場所が異なります)。
1. (記憶域) 静的変数はクラス全体に属するため、多数のオブジェクトをインスタンス化するときにメモリを節約できます。
2. (操作時間) 低レベルの観点から見ると、クラスの静的変数よりもインスタンス変数の方が時間がかかりませんが、クラス メソッドの静的変数についてはわかりません (専門家がこの質問に答えるのに役立ちます)。
いつ使用しますか?
1. (クラスに属する静的変数) たとえば、Person クラスのインスタンスがいくつインスタンス化されたかを記録したい場合は、クラスの静的変数を使用できます。 (例: ある場所に何人いるか: __construct を使用する場合は 1 を加算し、__destruct を使用する場合は 1 を減算します)
2. (クラスメソッドに属する静的変数) この状況は主に「コンテキスト関連」です。 (つまり、この関数では、この実行の結果は、四則演算などのこの実行の結果に直接または間接的に影響します)。
グローバル変数との類似点と相違点は何ですか?
グローバル変数は、名前が示すとおりグローバルです。オブジェクト指向プログラミングの主な目的は、「高い凝集性と低い結合性」を実現することです。たとえば、総人口 $count の場合、グローバル変数を使用すると、次にこの合計に遭遇したときに、変更が大きくなる可能性があります。他の人もこの変数を使用すると、コードを自分だけで作成できない場合があります。どうなるのですか?もうカップではありません。 。 。しかし、クラスの静的変数 (少なくとも各クラスには独自の $count があります)

定数をクラス内で使用する場合、この問題は問題になりません。クラスで定義された定数と非クラスで定義された定数の利点と欠点は何ですか?
クラスで定義された定数とクラス以外で定義された定数の違いは、その名の通り性別などの使用範囲です
person::GENDER_MALE = ' Male'
person::GENDER_FEMALE = 'メス'
ニワトリ::GENDER_MALE = 'オス'
ニワトリ::GENDER_FEMALE = 'メス'
Cat::GENDER_MALE = 'オス'
Cat::GENDER_FEMALE = 'メス'
グローバルに定義されている場合 これら 2 つの定数はあまり考慮されていません。

どのような状況で定数を定義する必要がありますか?
たとえば、人間の性別、動物のオスとメスなど。定数を定義せずに0|1、男性|女性とすると、男性を間違って入力するとメラになってしまいます。 ?そして、ある日、01 の表現を男性と女性に変更したい場合は、数千万行のコードを検索する必要があります。定義を変更するのではなく、定数を使用すると便利です。 。 。

PHP コード
#! /usr/bin/php
<?php
クラス人{
    
    パブリック静的 $count = 0; ### 记录類の例の数
    const GENDER_MALE = '男性';
    const GENDER_FEMALE = '女性';

    プライベート $_gender = self::GENDER_MALE;
    プライベート $_name = 'noname';

    パブリック関数 setName($name){
        $this->_name = $name;
        $this を返します。
    }
    
    パブリック関数 __construct($name='' , $gender=self::GENDER_MALE){
        self::$count++;
        $this->_name = $name;
        $this->_genger = $gender;
    }

    パブリック関数 __destruct(){
        自分::$カウント--;
    }
    
    パブリック関数 calc($action='add' , $num=1){
        静的 $sum = 0;

        if($action == '追加'){
            $sum += $num;
        }else if($action == 'sub'){
            $sum -= $num;
        }
        echo 'now $sum = ' , $sum , "n";
        $this を返します。
    }
    パブリック関数 getGender(){
        $this->_gender を返します;
    }
    public function setGender($gender=self::GENDER_MALE){
        $this->_gender = $gender;
    }
}

$ary = 配列();

foreach(range(1 , 100) as $_){
    $ary[] = 新しい人("人$_");
}

echo Person::$count , "n"; ### 100人

unset($ary[15]);      ### 销毁一个

echo Person::$count , "n"; ### 99人

$me = $ary[0]->setName("私");
$you = $ary[1]->setName("あなた");

foreach(range(1 , 3) as $_){ ###
    $me->calc("add" , $_*2);
    $you->calc("sub" , $_*3);
    エコー "================ n";
}
echo $me->setGender(person::GENDER_FEMALE);
echo $me->getGender();
<br><font color="#e78608">-----解解案---------</font><br>
静的変更量を使用すると、リソースの使用を減らすことができます???<br> タイプの静的プロパティと全体の局所的変更量の領域が異なる <br> の 1 つのタイプで複数のオブジェクトを例示する場合、静的プロパティはパブリック データベースです。各オブジェクトが共有する<br>は、リソースの消費とは何の関係もありません<br><br>と同様であり、類常量と常量もまた作用範囲が異なるだけです<br>の関係にあり、この種の静的方法は、作用範囲を受けます。制限関数<br><br>php5.3 に新たに追加された命名空間の概念、これらの「静态」的玩意就都将归位了<br><br>学习面向オブジェクトの编程、就要用面向オブジェクトの方法を参照してください<br>不要な翻訳のその名前の迷惑<br><br><br> <div class="clear"></div>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート