Przypisanie klasy do zmiennej w innej klasie

0

Witam,
natknąłem się na taki problem. Mam jedną klasę A i drugą B:

class A
{
   public function napiszCos(){ echo "bla bla bla" }
}

class B
{
  private $klasaA = new A();

   function __construct()
   {
      $this->klasaA::napiszCos();
   }
}

Tak naprawdę to w klasie B jest błąd bo nie można zrobić

$this->klasaA::napiszCos();

Pytanie moje brzmi jak odwołać się do zmiennej/funkcji z klasy A poprzez zmienną w klasie B ?

0

pewnie chodzi ci o coś takiego $this->klasaA->napiszCos()? w przypadku gdy metoda napiszCos jest statyczna to możesz użyć: call_user_func(array(get_class($this->klasaA), "napiszCos"));

0

Przecież ten kod Ci nawet przez parser nie przejdzie, więc nie wiem jak ty to w ogóle odpalasz?

Nie ma czegoś takiego: private $klasaA = new A();

<?php

class A
{
	// dopisany brakujący średnik
	public function napiszCos(){ echo "bla bla bla"; }
}

class B
{
	// poprawiona deklaracja
	private $klasaA;

	function __construct()
	{
		// utworzenie obiektu A przy tworzeniu obiektu B
		$this->klasaA = new A();

		// (możesz obiekt przekazać w konstruktorze, tj.
		// __construkt($obiektKlasyA)
		// $this->klasaA = $obiektKlasyA;

		// przykład wywołania metody
		$this->klasaA->napiszCos();

		// jeżeli chcesz wywoływać metodę statycznie
		// to napisz nazwę_klasy::nazwę_metody();
		// po cholere odwoływać się do obiektu danej klasy,
		// skoro i tak marzy Ci się wywołanie statyczne?

		// Źle:
		// $this->klasaA::napiszCos();
	}
}

?>
0
  1. U siebie mam deklarację i przypisanie wartości oddzielnie. Tutaj napisałem to tak. Dzięki za zauważenie błędu.
  2. Myślałem że tak nie można: $this->klasaA->napiszCos();
  3. Co do działania statycznego. Tak naprawdę klasa A w konstruktorze pobiera z bazy danych informacje. Dlatego potrzebuję mieć w wielu metodach klasy B, pobranie metod z klasy A utworzonej gdzieś wcześniej.
0
  1. To na następny raz kopiuj, nie pisz od nowa (ew. przepisuj uważniej ;P).
  2. A czemu nie? Zmienna $this jest obiektem, właściwość klasaA jest obiektem, więc zapis jest dobry. Gdyby napiszCos() zwracało obiekt (mniejsza o to jaki) to mógłbyś nawet zrobić $this->klasaA->napiszCos()->jeszczeCos();. Zawsze też można też sprawdzić czy zapis zadziała. IDE wywalające błędy składni na bieżąco też dobra rzecz.
  3. Jeżeli w ostatnim zdaniu chodziło Ci o obiekt klasy A - i jest to klasa do łączenia się z bazą - to nie powinieneś w każdym kolejnym obiekcie (np. klasy B) tworzyć nowego obiektu A, bo zapewne wywołasz tym drugie łączenie się z bazą. Utwórz sobie jeden obiekt klasy A i przekazuj go w konstruktorze klasy B i kolejnych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1