6

私が読んだウォークスルーに応じて、これについてさまざまな反応を受け取りました。

2 つの関数を持つクラスを定義しました。

両方の関数が DB 資格情報にアクセスできるようにしたい

現在、変数をコピーして各関数に貼り付けない限り、このコードは機能しません。

ここで何が間違っていますか?

<?php
class database  {
function connect()  {
var $username="my_username";
var $servername="localhost";
var $database="my_DB";
var $password="An_Awesome_Password";
var $con;
    $con = mysql_connect($servername,$username,$password);

    if (!$con)  {
    die('Could not connect: ' . mysql_error());
                }
                    }

function disconnect()   {
    $con = mysql_connect($servername,$username,$password);

    if (!$con)  {
    die('Could not connect: ' . mysql_error());
                }
    mysql_close($con);
                        }
            }
?>
4

6 に答える 6

12

このブロック:

var $username="my_username";
var $servername="localhost";
var $database="my_DB";
var $password="An_Awesome_Password";
var $con;

function()の内側ではなく、前に置く必要があります。しかし、まだclass定義の中にあります。

そして、明示的な可視性を追加するのは良い形です。最初にプライベート:

class database  {
    private $username="my_username";
    private $servername="localhost";
    // etc. etc.

次に、関数はそれらを次のように参照します。

$this->username;
$this->con;
etc.

理想的には、これらの資格情報をコンストラクターによって渡す必要があります。

private $servername;
private $database;
private $username;
private $password;
private $con;

function __construct($host, $user, $password, $dbname)
{
    $this->servername = $host;
    $this->username = $user;
    $this->password = $password;
    $this->database = $dbname;
}

さらに理想的には、PDOについて学ぶ

于 2012-06-14T13:40:31.407 に答える
3

オブジェクト プロパティにアクセスするには、 $this->property_name を使用する必要があります

 $this->con = mysql_connect($this->servername,$this->username,$this->password);

クラスコードは次のようになります。

<?php
class database  {
    var $username="my_username";
    var $servername="localhost";
    var $database="my_DB";
    var $password="An_Awesome_Password";
    var $con;

    function connect()  {

        $this->con = mysql_connect($this->servername,$this->username,$this->password);

        if (!$this->con)  {
            die('Could not connect: ' . mysql_error());
        }
    }

    function disconnect()   {
        $this->con = mysql_connect($this->servername,$this->username,$this->password);

        if (!$this->con)  {
            die('Could not connect: ' . mysql_error());
        }
        mysql_close($this->con);
    }
}
?>
于 2012-06-14T13:39:58.843 に答える
3

コードのスタイリングはさておき、変数はクラス メソッドの外側に定義する必要がありますが、クラスの内側にはまだあります。何かのようなもの:

class database {
    var $username = "my_username";
    // etc.

    function connect() {
        // connect code
        // $this->username == "my_username"
    }
}
于 2012-06-14T13:41:14.053 に答える
2

「var」を使用する代わりに、「public」、「protected」、または「private」のスコープをクラスのプロパティとメソッドに割り当てることをお勧めします。また、クラス プロパティはクラス内で割り当てられますが、関数 (別名「メソッド」) の外側に割り当てられます。リファクタリングされたクラスは次のとおりです。

class database  {
    private $username="my_username";
    private $servername="localhost";
    private $database="my_DB";
    private $password="An_Awesome_Password";
    private $con;

    public function connect()  {
        if (!$this->con) {
            $this->con = mysql_connect(
                    $this->servername, $this->username, $this->password);

            if (!$this->con)  {
                die('Could not connect: ' . mysql_error());
            }
        }
    }

    public function disconnect()   {
        if ($this->con)  {
            mysql_close($this->con);
        }
    }
}
于 2012-06-14T13:46:14.593 に答える
2

関数の外側で変数を使用し、construct関数とdestruct関数を使用する必要があります。これらにより、接続が適切に開いたり閉じたりすることが保証されます。

class database  {
    private $username = 'username';
    private $servername = "localhost";
    private $database = "my_DB";
    private $password = "An_Awesome_Password";
    private $conId;

   public function __construct(){
        $con = mysql_connect($this->servername, $this->username, $this->password);
        $this->conId = $con;
        //..........
    }


    public function __destruct(){
        mysql_close($this->conId);
    }
}
于 2012-06-14T13:42:23.583 に答える
0

変数は、変数が作成されたスコープ内でのみ呼び出すことができます。

関数で変数を作成すると、その関数でのみ使用できますが、はしごの上位に定義するほど、より多くの変数を使用できます。

グローバル パブリック プライベート機能

于 2012-06-14T13:50:56.107 に答える