У меня есть два класса, класс A и класс B, я пытаюсь получить доступ к классу B через функцию в классе A.
На данный момент я могу сделать это, создав новый экземпляр класса B внутри функции класса A, но я хочу знать, есть ли способ сделать это без создания нового экземпляра класса B внутри класса A. .
Вот пример того, что я хотел бы сделать:
class a{
function a(){
return $this->b();
}
}
class b extends a{
function b(){
return "It Works!";
}
}
$doIt = new a();
echo $doIt->a();
поэтому создание экземпляра B из A - единственный вариант?
Почему вы пытаетесь это сделать? Какова твоя цель? Возможно, мы могли бы предложить лучший способ сделать это? Способ, который вы предложили, кажется, ломает модель oop.
Ну, А не знает о В, но Б знает об А. Вы можете использовать А, но он ничего не знает о В.
В основном у меня есть класс B, который работает с базой данных, и класс A, который связывает действия пользователей на сайте с классом B. Таким образом, пользователь что-то делает-> класс A начинает работать-> передает информацию классу B для добавления в базу данных. Казалось, что это не так уж и возможно, но я знаю, что есть люди с гораздо большими знаниями, чем у меня, поэтому я хотел узнать, знает ли кто-нибудь еще какой-нибудь способ сделать это.






Вы не можете. Но вы можете ожидать абстрактный метод.
abstract class a {
function a() {
return $this->b(); // OK
}
abstract function b(); // Has no method body. Classes extending this class will implement it
}
class b extends a {
function b() {
return 'something';
}
}
$doIt = new b(); // Cannot instantiate abstract class a
echo $doIt->a();
Это эквивалент виртуальной функции С++?
Нет, это скорее эквивалент чистой виртуальной функции C++. Если не использовать final, все функции по умолчанию эквивалентны виртуальным функциям C++.
Например, int method() = 0; Попался. Очень круто. Полезно знать, что все методы php действуют как виртуальные функции.
Из вашего комментария:
Basically i have class B that works with the database, and class A that connects the users actions on the site to class B. So user does something->class A starts working->Passes info on to class B to add to the database. It did seem that this is not all that possible, but i know there are people with a lot more knowledge than I have so i wanted to see if anyone else knew of some way to do this.
Как вы описываете: B работает с базой данных, A выполняет действия (запрошенные пользователем). B звучит как какой-то объект сопоставления/доступа к данным, а A звучит как служба (я буду ссылаться на BMapper и AService, чтобы быть более преднамеренным).
То, что вы изложили, указывает на то, что вы неправильно используете наследование PHP. Наследование представляет отношения «является». (Image — это Media, PathMover — это Animator и т. д.). Хотя ответ @Malcolm технически работает, он не для вашего сценария.
В ООП мы бы сказали, что BMapper является зависимостью от AService. Таким образом, всякий раз, когда мы вызываем метод в AService, мы ожидаем, что он будет зависеть от экземпляра BMapper. Это отношение обычно выполняется через внедрение зависимости (см.: Что такое внедрение зависимостей?).
<?php
class AService {
private $bMapper;
public function __construct(BMapper $bMapper)
{
$this->bMapper = $bMapper;
}
public function doAction()
{
return $this->bMapper->performSomethingInDatabase();
}
}
class BMapper {
public function performSomethingInDatabase()
{
/**
* ..whatever
*/
}
}
$service = new AService(new BMapper);
$service->doAction();
Вы можете видеть, что мы определили зависимость нашего зависимого класса в его конструкторе, чтобы быть удовлетворенным тем, кто/что бы ни использовало этот класс.
Проголосовали за то, что показали, что композиция объектов — это то, что нужно.
Это не работает таким образом. Вы не можете создать экземпляр A и получить доступ к методам B. Вы можете создать экземпляр B и получить доступ к методам в A.