17

パブリック変数を設定するにはどうすればよいですか。これは正しいです?:

class Testclass
{
  public $testvar = "default value";

  function dosomething()
  {
    echo $this->testvar;
  }
}

$Testclass = new Testclass();
$Testclass->testvar = "another value";    
$Testclass->dosomething();
4

8 に答える 8

35

これが方法ですが、その変数のゲッターとセッターを作成することをお勧めします。

class Testclass

{
    private $testvar = "default value";

    public function setTestvar($testvar) { 
        $this->testvar = $testvar; 
    }
    public function getTestvar() { 
        return $this->testvar; 
    }

    function dosomething()
    {
        echo $this->getTestvar();
    }
}

$Testclass = new Testclass();

$Testclass->setTestvar("another value");

$Testclass->dosomething();
于 2009-12-30T17:44:59.307 に答える
5

コンストラクターを使用します。

<?php
class TestClass
{
    public $testVar = "default value";
    public function __construct($varValue)
    {
       $this->testVar = $varValue;               
    }
}    
$object = new TestClass('another value');
print $object->testVar;
?>
于 2009-12-30T17:44:16.817 に答える
5
class Testclass
{
  public $testvar;

  function dosomething()
  {
    echo $this->testvar;
  }
}

$Testclass = new Testclass();
$Testclass->testvar = "another value";    
$Testclass->dosomething(); ////It will print "another value"
于 2014-05-31T06:18:13.303 に答える
0

その変数/属性の値を「設定」しています。オーバーライドしたり、オーバーロードしたりしないでください。あなたのコードは非常に一般的で正常です。

これらの用語(「セット」、「オーバーライド」、「オーバーロード」)はすべて特定の意味を持っています。オーバーライドとオーバーロードは、ポリモーフィズム(サブクラス化)に関するものです。

http://en.wikipedia.org/wiki/Object-oriented_programmingから:

ポリモーフィズムにより、プログラマーは派生クラスのメンバーを親クラスのメンバーと同じように扱うことができます。より正確には、オブジェクト指向プログラミングのポリモーフィズムは、異なるデータ型に属するオブジェクトが、それぞれが適切な型固有の動作に従って、同じ名前のメソッドのメソッド呼び出しに応答する機能です。1つのメソッド、または+、-、*などの演算子は、さまざまな状況で抽象的に適用できます。犬がspeak()するように命令された場合、これはbark()を誘発する可能性があります。ただし、Pigがspeak()を実行するように命令された場合、これによりoink()が発生する可能性があります。どちらもAnimalからspeak()を継承しますが、派生クラスのメソッドは親クラスのメソッドをオーバーライドします。これは、ポリモーフィズムのオーバーライドです。ポリモーフィズムのオーバーロードとは、1つのメソッドシグネチャ、または「+」などの1つの演算子を使用することです。実装に応じていくつかの異なる機能を実行します。たとえば、「+」演算子は、整数の加算、浮動小数点の加算、リストの連結、または文字列の連結を実行するために使用できます。IntegerやDoubleなどのNumberの2つのサブクラスは、OOP言語で適切に追加されることが期待されます。したがって、このように機能するには、言語は加算演算子「+」をオーバーロードする必要があります。これにより、コードの可読性が向上します。これがどのように実装されるかは言語によって異なりますが、ほとんどのOOP言語は、少なくともある程度のオーバーロードポリモーフィズムをサポートしています。OOP言語で適切に追加することが期待されています。したがって、このように機能するには、言語は加算演算子「+」をオーバーロードする必要があります。これにより、コードの可読性が向上します。これがどのように実装されるかは言語によって異なりますが、ほとんどのOOP言語は、少なくともある程度のオーバーロードポリモーフィズムをサポートしています。OOP言語で適切に追加することが期待されています。したがって、このように機能するには、言語は加算演算子「+」をオーバーロードする必要があります。これにより、コードの可読性が向上します。これがどのように実装されるかは言語によって異なりますが、ほとんどのOOP言語は、少なくともある程度のオーバーロードポリモーフィズムをサポートしています。

于 2009-12-30T17:40:07.367 に答える
0

オーバーロードするには、サブクラスが必要です。

class ChildTestclass extends Testclass {
    public $testvar = "newVal";
}

$obj = new ChildTestclass();
$obj->dosomething();

このコードはエコーしnewValます。

于 2009-12-30T17:41:13.703 に答える
0

getterメソッドとsetterメソッドをクラスに追加します。

public function setValue($new_value)
{
    $this->testvar = $new_value;
}

public function getValue()
{
    return $this->testvar;        
}
于 2009-12-30T17:42:17.533 に答える
0

内部class Testclass:

public function __construct($new_value)
{
    $this->testvar = $new_value;
}
于 2009-12-30T17:38:24.720 に答える
0

与えられた例に従う場合 (ゲッター/セッターを使用するか、コンストラクターで設定する) は、変数に設定される内容を制御する方法であるため、プライベートに変更します。

これらすべてがクラスに追加された状態でプロパティを公開しておくことは意味がありません。

于 2009-12-30T18:05:23.077 に答える