0

OOPに切り替えようとしています。インターネット上で killerphp によって書かれた便利な PDF を見つけました。エラーが発生したため、今まで彼の例に従いました。出力は次のとおりです。

警告: person::__construct() の引数 1 がありません。15 行目で C:\xampp\htdocs\oop\index.php で呼び出され、8 行目で C:\xampp\htdocs\oop\class_lib.php で定義されています。

注意: 未定義の変数: C:\xampp\htdocs\oop\class_lib.php の 10 行目の person_name

Stefan's full name: Stefan Mischook

Nick's full name: Nick Waddles

これは index.php (私が実行するページ) です。

<?php
    require_once('class_lib.php');
?>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>OOP in PHP</title>
</head>

    <body>
        <?php
            // Create object without constructor by calling a method
            $stefan = new person();
            $stefan->set_name("Stefan Mischook");
            echo "Stefan's full name: " . $stefan->get_name();

            echo "<br>";

            // Create object with constructor
            $jimmy = new person("Nick Waddles");
            echo "Nick's full name: " . $jimmy->get_name();

        ?>
    </body>
</html>

そして、ここにクラスがあります:

<?php
    // A variable inside a class is called a "property"
    // Functions inside a class are called "methods"
    class person
    {
        var $name;

        function __construct($persons_name)
        {
            $this->name = $persons_name;
        }

        function set_name($new_name)
        {
            $this->name = $new_name;
        }

        function get_name()
        {
            return $this->name;
        }
    }

    // $this can be considered a special OO PHP keyword

    // A class is NOT an object. The object gets created when you create an instance of the class.

    // To create an object out of a class you need to use the "new" keyword.

    // When accesign methods and properties of a class you use the -> operator.

    // A constructor is a built-in method that allows you to give your properties values when you create an object
?>

コメントは気にしないでください。私はそれらを学習に使用します。ありがとうございます。評価を下げる前に質問を編集する必要がある場合はお知らせください。乾杯!

4

5 に答える 5

4

問題はここにあります:

// Create object without constructor by calling a method
$stefan = new person();                        // <-----
$stefan->set_name("Stefan Mischook");

必須パラメーターをコンストラクターに渡していません。

  function __construct($persons_name)
  {
      $this->name = $persons_name;
  }

この (コンストラクター)には、クラス$persons_nameの新しいインスタンスを構築するための引数が必要です。person

また(関連)、あなたのコメント// Create object without constructor by calling a methodは、コードが行っていることとはまったく異なります。コンストラクターを呼び出していますが、それが問題です。おそらく、これはいくつかの例から部分的にコピーされたもので、何かを見逃していませんか?

于 2013-11-07T08:19:29.667 に答える
2

次の行を置き換えると、例はエラーなしで機能します。

function __construct($persons_name)

これについて:

function __construct($persons_name='')

そのため、オブジェクトのコンストラクターにデフォルトの空の文字列を指定します。

于 2013-11-07T08:21:17.333 に答える
1

これを試して:

$stefan = new person("something");
$stefan->set_name("Stefan Mischook");

また、クラス名にはCamelCaseを使用することをお勧めします。

于 2013-11-07T08:21:12.677 に答える
1

パラメータの (一部の) なしでメソッドを呼び出せるようにしたい場合は、デフォルト値を定義する必要があります。

public function __construct($persons_name = NULL) {
    /* do something with $persons_name */
}

それ以外の場合、関数はパラメーターが であると想定し、誤った関数呼び出しについて知らせるメッセージをrequired生成します。Notice

于 2013-11-07T08:21:51.013 に答える
0

__construct メソッド/関数を指定しました。そのクラスの新しいオブジェクトを作成すると、それが呼び出されます。たまたま、引数が 1 つ必要であると言い、クラスのオブジェクトを作成したときに 1 つも与えなかったのです。それがどうあるべきかは次のとおりです。

$stefan = new person('Stefan Mischook');

変更したくない場合を除き、後で set_name メソッド/関数を使用する必要はありません。

__construct メソッド/関数に対してこれを行うこともできます。

function __construct($persons_name='')

これが行うことは、引数を与えない限り、 $person_name を空の文字列に自動的に割り当てることです。その場合、与えた引数は空の文字列を置き換えます。

于 2013-11-07T08:20:14.800 に答える