1

だから、私はいくつかの本当に単純なphp/htmlコードであると私が信じているものを持っています。_construct()HTMLフォームの前にメソッドがどのように実行されていないのか理解できません。誰か説明してもらえますか?

私のページからのコード:

<?php   class register {
        function __construct() {
            echo 'SYSTEM: This is the register page';
        }
    }

?>
    <form action="http://abc.org/test" method="POST">
    <input type="username" value="">
    <input type="password" value="">
    <input type="submit" value="Register">
    </form>

外観:

見た目

編集 元の投稿にこれが含まれていないことをお詫びしますが、私は別のページからクラスを作成しています。

ページabc.com/aには次のコードがあります。

<?php require './'.'register'.'.php'; 
                $obj = new register; ?>

この質問の上部にあるコードはregister.phpからのものです

4

4 に答える 4

4

クラスを定義していますが、そのクラスタイプのオブジェクトをインスタンス化する場所がわかりません。ここに貼り付けたものの後に、インスタンス化を行うコードがもっとあるはずです。したがって、echo()呼び出しが表示されます。

于 2012-05-04T23:07:22.730 に答える
2

私は bfavaretto に同意します。彼のコード スニペットは確実に機能します。私は通常、クラス、関数、および出力を別々のファイルに保存して、次のようにプロジェクト間の使いやすさを少し高めたいと考えています。もう少し PHP コーディングが必要かもしれませんが、最終的には、再利用性が大いに役立ちました。私はあなたのプロジェクトを次のように整理します。

ロード中の元のページ:

<?php require './includes/class/register.class.php'; ?>
<?php include './includes/registerModules.php'; ?>

$register = new register();  //Calls the constructor for class 'register'

<?php registerForm(); ?> // Runs the registerForm() function.  Nothing is output to the browser until this function is called.  That way you can include a test to see if a user is already logged in and use a header redirect (which requires that no output code be sent to the browser before the header function is called) if you so desire.

./includes/class/register.class.php

class register {
    function __construct() {
        echo 'SYSTEM: This is the register page';
    }
}

./includes/registerModules.php

function registerForm(){
    echo '<form action="http://abc.org/test" method="POST">
    <input type="username" value="">
    <input type="password" value="">
    <input type="submit" value="Register">
    </form>';
}

このようにして、register.class.php に追加できるクラスが必要な場合はいつでも、登録フォームを表示する必要がないページにクラスを含めることができます。必要な後処理など。クラスはすべてそこにあり、適切なコンストラクター (この場合は$register = new register();) を使用してそれらをインスタンス化できます。

registerModules.php に関数を含めたので、目的の関数を呼び出す場所であれば、関数の出力は関数呼び出しが行われた場所に表示されます。書式設定を容易にします。たとえば、 を呼び出すまでフォームは表示されません<?php registerForm(); ?>。そうすれば、上記のように必要なコンストラクターを作成した後にフォームを再利用し、サイトの他の領域で共通の書式設定でフォームを表示できます。

この場合、登録フォームは 1 回しか表示されない可能性が高いことはわかっていますが、これは再利用可能な書式設定であり、任意の共通要素に適用できます。

于 2012-05-04T23:38:52.273 に答える
1

コンストラクターを呼び出すには、最初にクラスをインスタンス化する必要があります。次に例を示します。

$register = new register();

それはコンストラクターと呼ばれます。クラスを定義するだけですが、自動的に実行されるわけではありません。関数についても同じですが、それらも呼び出す必要があります。

コンストラクタとデストラクタを参照newしてください。

于 2012-05-04T23:07:37.807 に答える
1

require行の後にフォームがすでに出力されているため、クラスコードはフォームの後に実行されます。その場合にのみ、コンストラクターがメッセージをエコーするクラスをインスタンス化します。

フォームの前にエコーする場合は、定義した直後にクラスをインスタンス化します。

<?php   
class register {
    function __construct() {
        echo 'SYSTEM: This is the register page';
    }
}
$register = new register();
?>
<form action="http://abc.org/test" method="POST">
    <input type="username" value="">
    <input type="password" value="">
    <input type="submit" value="Register">
</form>
于 2012-05-04T23:15:26.697 に答える