2009-10-20 2 views
2

У меня есть два класса в приложении PHP, B - расширение A, например. класса А имеет функцию, которая возвращает некоторые другие его свойства в виде массива SQL вставки запросов, напримерPHP, расширяющий свойства класса

Class A { 
$property_a; 
$property_b; 
$property_c; 
$property_d; 

function queries() { 
$queries = array(); 
$queries[] = "INSERT INTO xxx VALUES " . $this->property_a . ", " . $this->property_b"; 
$queries[] = "INSERT INTO yyy VALUES " . $this->property_b . ", " . $this->property_d"; 
} 
} 

Я хотел класса B, чтобы иметь такой же (идентичный) функцию, которая делает то же самое для свойства класса B, в то время как все еще сохраняя значения из класса А. идея заключается в том, что каждый запрос будет передан через конечной функции все в то же время, а именно:

$mysqli->query("START TRANSACTION"); 
foreach($queries as $query) { 
if(!$mysqli($query)) { 
$mysqli->rollback(); 
} 
} 

Если все ОК $ mysqli-> совершить() ;

Что было бы самым простым способом достичь этого? Любые советы и идеи. Спасибо!

ответ

4

В B :: запросов() можно вызвать реализация по parent «s этого метода и добавить данные в массив A :: запросов() возвращает.

class B extends A { 
    protected $property_e=5; 
    public function queries() { 
    $queries = parent::queries(); 
    // In a real application property_e needs to be sanitized/escaped 
    // before being mixed into the sql statement. 
    $queries[] = "INSERT INTO zzz VALUES " . $this->property_e; 
    return $queries; 
    } 
} 
$b = new B; 
foreach($b->queries() as $q) { 
    echo $q, "\n"; 
} 

Но вы можете (также) захотеть заглянуть в библиотеку ORM, например, например. doctrine.

+0

+1 Доктрина скалы! –

+0

Спасибо, Еще один вопрос. Возможно ли продлить этот процесс еще дальше? Например, чтобы иметь класс C, который может получить доступ к его родительской функции, а также ее родительскую функцию? Надеюсь, что имеет смысл lol – Dan

+1

c :: queries() вызывает реализацию своего родителя (B :: queries()), которая вызывает родительский реализация (A :: queries()). A :: queries() возвращает массив, B :: queries() добавляет свои элементы и возвращает массив, C :: queries() добавляет его элементы и возвращает массив. Это может продолжаться вечно, если вам нравится ;-) – VolkerK

0

Используйте функцию геттера для захвата свойств в запросах(). В каждом классе вы можете контролировать, какие значения использует функция запросов.

0

Вы не можете переносить материал из одного экземпляра в другой, не инициализируя новый класс информацией другого экземпляра. Таким образом, вы можете расширить, чтобы изменить содержимое функции запроса B, а затем инициализировать B с Экземпляр:

class A { 
    protected $propa = ""; 
    protected $propb = ""; 
    //etc 

function query { /*...*/ } 
} 

class B extends A { 
    function __construct(A $classA) 
    { 
     $this->propa = $classA->propa; 
     // etc 
    } 
    function query() 
    { 
     //B-type queries 
    } 
} 

$A = new A(); 
// set stuff in a 
new B($A); 

Если A и B являются 100% то же самое (в том числе функция запроса), просто клонировать A: $ а = новый A(); $ b = clone $ a;

0

, так что вы хотите использовать свойства класса A и класса B? вы можете сделать это, используя родительский. в классе B:

function queries(){ 
    $queries = array() 
    //stuff to get queries 

    return array_merge($queries,parent::queries()); 
} 
+0

Вы не можете использовать свойство parent :: $ для получения значений свойств в экземпляре класса. Вы можете сделать это со статическими классами, но вряд ли это приведет к желаемому результату. –

+0

Это не то, что я делаю вообще. Я называю родительский метод, а не значение. – GSto

Смежные вопросы