Umarım OOP Hareketli!

4 Cevap

Bu yüzden daha fazla OOP anlamak ve kullanmak çalışıyorum.

I OOP kullanmaya başlamadan önce aşağıdaki kod yazılmıştır.

//loop through all the users 
$game = "$_POST[Game]_teams";
$result = mysql_query("SELECT username FROM `users`") or die(mysql_error());
while( $row=mysql_fetch_assoc($result) )
{
    $u[] = $row['username'];
}

Ben aşağıdaki gibi benim veritabanı sayfanın içine sorgu koyduk:

   function selectAllUsers()
   {
        $q = "SELECT username FROM ".TBL_USERS."";
        mysql_query($q, $this->connection);
   }

I'm a little confused about how the rest could be different? Would it be? Is it possible for anyone to help me without more code or understanding of my structure?

4 Cevap

Sınıfında Her fonksiyon one görev ve one görevi sadece yapmalıyım ve uygun adlı olmalıdır.

Sizin selectAllUsers function sadece bunu yapmış gibi, tüm kullanıcıları seçin, olmalıdır

function selectAllUsers() {
 $q = "SELECT username FROM ".TBL_USERS."";
 return mysql_query($q, $this->connection);
}

Ancak, biz daha sonra kullanabileceğiniz resource, hangi geri dönmek için, bir return anahtar kelime ekledi.

Daha sonra selectAllUsers işlevi returned MySQL kaynak kullanarak kullanıcının bir dizi doldurmak istiyorum generateUserArray adında bir işlevi olabilir.

function generateUserArray() {
 $u = array();
 $result = $this->selectAllUsers();
 while( $row=mysql_fetch_assoc($result)) {
  $u[] = $row['username'];
 }
 return $u;
}

Sorunuzun ilgili daha fazla bilgi, daha fazla cevaplar sizin başarmak için çalışıyoruz ne açısından aldığınız, ya da herhangi bir karışıklığa kadar açık olacak.


Öncelikle, burada benim test tablo (users) benim test veritabanından (login),

mysql> select * from users;
+-----------+-----------+
| Name      | Password  |
+-----------+-----------+
| aforloney | whatsup   |
| pam       | qwerty    |
+-----------+-----------+
2 rows in set (0.15 sec)

Ve burada MyClass.php benim testi sınıf

class MyClass {

 function connect() {
  mysql_connect("localhost","root","password");
  mysql_select_db("login");
 }

 function selectAllValues() {
  $q = "SELECT * FROM users";
  return mysql_query($q);
 }

 function printAllValues() {
  $result = $this->selectAllValues();
  while ($row = mysql_fetch_assoc($result)) {
   echo $row['Name'] . " and " . $row['Password'] . "<br/>";
  }
 }
}

Hangi sonra şöyle bir Main sınıftan çağırmak,

class Main {    

// other variables...

// __construct is an object's constructor, it's what gets called when 
// you create a new Main object

  function __construct() {

   $myClass = new MyClass();
   $myClass->connect();
   $myClass->selectAllValues();
   $myClass->printAllValues(); 

  }
}

Sonra adlandırılan

$m = new Main(); // will invoke the __construct function

Hangi irade çıktı tarayıcıya,

 aforloney and whatsup
 pam and qwerty

Sadece başka bir karışıklığı önlemek için bir yan not olarak, benim MyClass ve Main örnek same PHP dosyası içinde iki sınıf vardı. Eğer yukarıdaki kod örnekleri kullanmak ve bir MyClass nesne oluşturmak için denemek için olsaydı, bir hata atmak olacaktır.

Eğer another sınıfında tanımlanmış bir nesne örneğini isteseydim, bir include deyimi gerekir.

İki farklı PHP dosyaları ile bu yüzden, ben, gibi pek Main sınıf için benim kodunu değiştirmek istiyorum

<?php
include ('MyClass.php'); 
class Main {
 ...
}
?>

Her şeyden önce, sen (php.net bakınız) PDO geçiş düşünmelisiniz. Bu doğa tarafından bir daha cepten-imsi bir yaklaşımı vardır ve daha iyi ve daha sezgisel bir API artı mysql_ * işlevlerine aykırı diğer birçok özellik sağlar.

Son derece basit bir örnek: Burada veritabanındaki kullanıcı verilerini getiriliyor ve bu veri ile kullanıcı nesneleri doldurmak vardır.

<?php
class UserMapper {
    protected $connection;
    public function __construct(PDO $connection) {
        $this->connection = $connection;
    }

    public function findAll() {
       $statement = $this->connection->prepare("SELECT * FROM users");
       $statement->execute();
       return $statement->fetchAll(PDO::FETCH_CLASS, 'User');
    }
}

class User {
    public $name;
    public $email;
    public $password;
}

$connection = new PDO('mysql:dbname=users;host=127.0.0.1', 'root', 'root');
$userMapper = new UserMapper($connection);

$users = $userMapper->findAll();
print_r($users);

I've in the past used some php metaprogramming to accomplish this. http://iain.codejoust.com/2010/02/very-basic-php-orm/

Genel bir fikir bir model sınıf oluşturmak için, ve veritabanı sınıfını sağlayan kurulum php __ çağrı işleyicisi, denilen yöntem yakaladığını argümanları kurar, sonra model sınıf argümanlar oluşturulan bir SQL dizesi ve Modeli işlevini verir.

Işlevi çağrıldığında, sonuç içinde bulunan SQL sorgusu sonuçları ile bir PDO nesnedir.

Ayrıca http://www.doctrine-project.org/ daha az çaba ile çok cepten etkin bir arayüz sağlamak için gibi PHP ORMs de bir göz atabilirsiniz.

Aslında ben senin örnek fonksiyonel yapısal den geçer derdi ama ben nesne yönelimli bir örnek yapar diyemem.

Bir nesne yönelimli örnek gibi daha fazla olacaktır:

class user {

public $username;
public $password;

public function showUsername(){
  echo 'Username is '.$this->username;
}

public function showPassword(){
  echo 'Password is '.$this->password;
}
}