Birden sınıfları birleştiren bana PHP hataları veriyor?

4 Cevap php

Böyle bir yapıya sahip bir web sitesi oluşturma:

class main { }

class mysql extends main { }

class user extends main { }

class etc extends main { }

Bu sınıflar birbirinden işlevleri kullanmak için fikirdir. Bu işe yaramazsa. Nasıl mysql gelen bir işlevi çağırabilirsiniz user?

EDIT: All errors are similar to this one:

Fatal error: Call to undefined method user::function_in_mysql() in C:\foo.php on line 8

Martti Laine

4 Cevap

Bir sınıfın başka bir uzamr kendisine diğer (ebeveyn) yöntemleri kullanılabilir hale getirir. Bu yüzden user main, sadece kendisine main mevcut yöntemlerini sağlar uzanmaktadır. Diğer sınıflar uzatmak varsa main bunların hepsi birbirlerinin yöntemlerini çağırmak için izin vermez. Sen user mysql uzatmak ve mysql 's yöntemleri ardından user though I don't believe that fundamentally this is what you're looking for kullanılabilir olacaktır olabilir.

Ben bağımlılık enjeksiyon ve sınıf değil miras çizgisinde bir şey arıyoruz düşünüyorum.

Eğer kullanıcı sınıfı mysql sınıfı erişimi istiyorsa Örneğin bunu yapıcısında bunun bir örneğini iletir.

class user {
    protected $_mysql;

    public function __construct(mysql $mysql) {
        $this->_mysql = $mysql;
    }

    public function myMethod() {
        $this->_mysql->myMysqlMethod();
    }
}

$mysql = new mysql();
$user = new user($mysql);

$user->myMethod();

İşte bağımlılık enjeksiyon bazı iyi okuma bulunuyor.

Özellikle Senfoni bağlantı bağımlılık enjeksiyon bakış ve kurulum nasıl bir bağımlılık kabı üzerinde oldukça güzel okunur.

Bu sınıflar birbirinden işlevleri kullanmak için fikirdir.

Yani ne yaptığınızı değil: Veraset sadece tek bir yol gidiyor. mysql, user ve etc birbirinden olanlar değil main s yetenekleri miras but.

Sen mysql user genişlet olabilir etc, böylece en az mysql tüm işlevleri çağırabilir ama muhtemelen mantıklı olmaz Ben onlar ataları değil ama siblings birbirlerine, bir belirgin farklı fonksiyonu yerine düşünüyorum.

Bu yüzden birbirlerinin işlevleri çağırmak mümkün olacaktır or birbirlerine sınıfları tanıtmak - sık sık gitmek için en iyi yolu - Sen main herhangi bir paylaşılan yöntemleri tanımlamak için ya var olacaktır. Siz, örneğin, kurucusuna parametre olarak her ihtiyaç sınıfının bir örneğini ekleyebilirsiniz:

$etc = new etc();
$mysql = new mysql($etc);

// mysql's constructor sets $this->etc 
// so that it can call etc's functions using $this->etc->function()

ya da, daha karmaşık, bağımlılık enjeksiyon veya tekiz kalıplarını kullanarak. Belki size biraz ilham verir, PHP bu ile nasıl başa çıkılacağı konusunda a related question, bir süre önce sordu ve geribildirim bir sürü var.

Bu bir sınıf çalışmaları uzanan nasıl değil. Tüm sınıflarda bulunması gereken tüm fonksiyonlar ana parçası olmalıdır. Sonra mysql özgü işlevleri olduğunu sınıfta gitmek. Senin düşündüğün gibi sınıfları olarak yakından miras açısından bağlantılı olmadığını tahmin ediyorum. Kullanıcı sınıfı mysql sınıfı aracılığıyla görüşme yapmak gerekiyorsa, bir mysql nesneyi tutan kullanıcı sınıfında bir değişken var.

Içinde mysql bir işlevi çağırmak için user Eğer user içindeki bir mysql nesne oluşturmak ve işlevini diyebiliriz.

<?php
// this is user.php
$var = new mysql(); // <--if it takes parameters in the constructor
$var->method();
...
?>

Daha iyi bir cevap sizin için, ne hatalar alıyorsanız gibi, daha fazla bilgi verebilir misiniz?