0

サイトに関する詳細を引き出すオブジェクトがあります。基本的に名前アドレスなどです。引き戻すフィールドの 1 つは IDCounty です。下記参照。次に、これを別のオブジェクトの新しいインスタンスにフィードすると、郡名が自動的に表示されます。これが私が持っているものです

だから私のシステムオブジェクト

   class System{

private $db;
public $Ad1;
public $Ad2;
public $County;
public $IDSystem;

    //connect to database
    public function __construct($IDSystem ='1') {
        $this->db = new Database(); 
        $this->IDSystem = $IDSystem;
    }
           //get address
    public function ContactInfo() {
            $Query = sprintf("SELECT BSAd1, BSAd2, IDCounty FROM BusinessSettings WHERE IDBusinessSettings = %s", 
        GetSQLValueString($this->IDSystem, "int"));

                $Query = $this->db->query($Query);
                $Result = $this->db->fetch_assoc($Query);

                        $this->Ad1 = $Result['BSAd1'];
                        $this->Ad2 = $Result['BSAd2'];  

                        $County = new County($Result['IDCounty']);
                        $this->County = $County;
    }
    //end address   
       }

ご覧のとおり、このオブジェクトは別の郡を呼び出し、$County を $this->County に設定しています。そのための私の詳細は以下のとおりです

  class County {
public $IDCounty;
private $db;

    public function __construct($IDCounty) {

        $this->db = new Database();         
        $this->IDCounty = $IDCounty;

              $Query = sprintf("SELECT CountyName FROM County WHERE IDCounty = %s",                                                                              GetSQLValueString($this->IDCounty, "int"));

                $Query = $this->db->query($Query);
                $County = $this->db->fetch_assoc($Query);

                 return $County['CountyName'];  


    }

}

オブジェクトを呼び出すときは、次のように呼び出します

    $SiteDetails = new System();

        $SiteDetails->ContactInfo();

         echo $SiteDetails->Ad1;
         echo $SiteDetails->County;

echo $SiteDetails->County; のエラー レポートからエラーが発生しました。「キャッチ可能な致命的なエラー: クラス County のオブジェクトを文字列に変換できませんでした」

このエラーをグーグルで調べた後、System クラスが County クラスから郡名を取得して $this->County に変換する際に問題が発生していることがわかります

残念ながら、私はそれを修正する方法がわかりません。インスタンス化時に関数から値を返すことができると思っていましたが、間違っているようです。助けてください。みんなありがとう。

4

2 に答える 2

1

returnコンストラクターに含まれるステートメントが何であれ、それらは無視されます。コンストラクターは、定義により、指定されたクラスの新しいインスタンスを返します。ドキュメントを読んでください。の署名__construct()は の戻り値の型を示していますが、 (void ポインター)voidと考える必要があります。void*つまり、新しく作成されたオブジェクトへの参照を返します。return ステートメントを次のようなものに置き換える必要があります。

$this->stringValue = $County['CountyName'];

そして、他にも多くのマジックメソッドがあるため、クラスを文字列として使用する別のメソッドを実装できます:マジック__toStringメソッド:

public function __toString()
{
    return (string) $this->stringValue;//the cast is optional
}

いつものように、他のいくつかの魔法の方法に関するドキュメントを読んでください。それらは非常に便利ですが、追加する必要がありますが、遅い/遅くなる可能性があります。同様にgetterを実装することもできます。

//assuming this is in your constructor:
$this->stringValue = $County['CountyName'];

public function getContyName($default = '')
{
    if (!$this->stringValue)
    {
        return $default;
    }
    return $this->stringValue;
}

$defaultさて、引数のおかげで、私はこれを行うことができます:

$county = new County();//not passing any values
echo $county->getCountyName('unknown');//will echo unknown
echo $county->getCountyName();//echoes empty string, because that's the default value of $default...
$county2 = new County('Foobar');
echo $county2->getCountyName('unknown');//echoes Foobar, county is known...

それ以外は、あなたのsprintf電話は私にはあまり意味がありません。使用される形式はであるため、文字列%sを渡すことを期待しています。実際には、グローバル関数への呼び出しの戻り値である を渡しています(恐ろしいコードの匂いがします)。そこに引数として渡しているので、戻り値は int になると思いますが、なぜあなたのフォーマットではないのでしょうか? ここで作業が必要なことが他にもたくさんあります (たとえば、params を使用せずに新しいインスタンスを作成しますか?本当に?DB オブジェクトを使用してクエリを実行しないのはなぜですか?なぜグローバル関数を使用するのですか?なぜプリペアド ステートメントを使用しないのですか? ... OOPについてもう少し読んでくださいGetSQLValueString($this->IDCounty, "int")'int'%dsprintf
Database

于 2013-09-16T12:10:06.073 に答える
0

__toString()County クラスにメソッドを実装します。例:

public function __toString()
{
    return $this->foo;
}
于 2013-09-16T12:09:36.907 に答える