0

私はPHP OOPを初めて使用し、別のクラス内にいくつかのクラスをネストして、後で次のように呼び出したいと考えています。

$sql = new SQL();
$sql->Head()->Description($_SESSION['page']);
  //OR
$sql->Head()->Keywords($_SESSION['page'])
  //OR
$sql->Body()->Clients($_SESSION['client'])
  //ETC
$query = $sql->Run(); // equivalent to mysql_query("...");

ご想像のとおり、いくつかの問題に遭遇し、次の貧弱なコードで終了しました。

<?php
require( $_SERVER['DOCUMENT_ROOT'] . '/#some_db_directory/database.php');
//This file contains $db['host'], $db['user'], etc...

class SQL {
    public $sql;

    public function __construct() {
        global $db;
    }

    public class Head() {

        public function Description($page) {
            return "SELECT * FROM `$db['database']`.`desciption` WHERE `page` = '$page'";
        }

        public function Keywords($page) {
            return "SELECT * FROM `$db['database']`.`keywords` WHERE `page` = '$page'";
        }
    }
}

$sql = new SQL();
echo $sql->Head()->Description('home'); //For testing
  • PHPでクラスをネストすることは可能ですか?
  • もしそうなら、それはどのように行われますか?
4

3 に答える 3

1

あなたがやろうとしていることは と呼ばれEncapsulationます。詳細については、 PHP カプセル化に関する Google 検索をお試しください。

http://www.weberdev.com/get_example.php3?ExampleID=4060のコード例を次に示します。

<?php 

class App { 

     private static $_user; 

     public function User( ) { 
          if( $this->_user == null ) { 
               $this->_user = new User(); 
          } 
          return $this->_user; 
     } 

} 

class User { 

     private $_name; 

     public function __construct() { 
          $this->_name = "Joseph Crawford Jr."; 
     } 

     public function GetName() { 
          return $this->_name; 
     } 
} 

$app = new App(); 

echo $app->User()->GetName(); 
?>
于 2012-11-13T11:01:01.253 に答える
1

database.phpそれはデータベースクラスだと思います。その場合、このようなことができます。

head.php

Class Head{
    private $_db;
    private $_dbName;

    public function __construct($db, $dbName){
        $this->_db = $db;
        $this->_dbName = $dbName;
    }
    public function Description($page) {
       $results = $this->_db->query("SELECT `text` FROM `$this->_dbName`.`description` WHERE `page` = '$page'");
       return '<meta name="description" content="' . $results['text'] . '">';
    }

    public function Keywords($page) {
       $results = $this->_db->query("SELECT * FROM `$this->_dbName`.`keywords` WHERE `page` = '$page'");
       $keywords = array();
       foreach($results as $result){
           array_push($keywords, $result['word']);
       }
       return '<meta name="keywords" content="' . implode(',', $keywords) . '">';
    }
}

sql.php

require( $_SERVER['DOCUMENT_ROOT'] . '/#some_db_directory/database.php');
// Require head class file
require( $_SERVER['DOCUMENT_ROOT'] . '/#some_db_directory/head.php');   

Class SQL{
    public $Head;

    public function __construct($dbName){
        global $db;
        $this->Head = new Head($db, $dbName);
    }
}

次に、データベースの名前を SQL クラスに渡します (これが Head クラスに伝達されます)。

// Require the sql class file
require( $_SERVER['DOCUMENT_ROOT'] . '/#some_db_directory/sql.php');
$sql = new SQL('mydatabase');
echo $sql->Head->Description('home');

ここでも、データベース クラスは、ここで使用している方法で結果を返さない可能性があることに注意してください。特定のデータベース クラスで動作するように、これを変更する必要があります。

于 2012-11-13T11:01:14.833 に答える
0

このようにしてみてください

<?php
require( $_SERVER['DOCUMENT_ROOT'] . '/#some_db_directory/database.php');
//This file contains $db['host'], $db['user'], etc...

class SQL {
    public $sql;
    private $_head;

    public function __construct() {
        global $db;
        $_head = new HeadClass();
    }

    public function Head() {
        return $this->_head;
    }
}

class HeadClass { // Class cannot have a public access modifier

    public function Description($page) {
        return "SELECT * FROM `" . $db['database'] . "`.`desciption` WHERE page = $page";
    }

    public function Keywords($page) {
        return "SELECT * FROM `" . $db['database'] . "`.`keywords` WHERE page = $page";
    }
}

$sql = new SQL();
echo $sql->Head()->Description('home.html');
?>

クラス宣言をクラスの外に移動し、in でクラスのインスタンスSQLを作成しています。これは、関数を介して利用可能になりHead()ます。

注: body については、別のクラスを作成し、head で行ったように SQL クラスで参照を使用する必要があります。

于 2012-11-13T11:00:56.393 に答える