Przekazywanie wartosci przez referencje

0

Witajcie! Potrzebuję pomocy w temacie przekazywania argumentów funkcji przez referencję. Mam projekt "System zarzadzania imprezami turystycznymi", który piszę w OOP PHP. Mam dwa pliki: pierwszy("Ustaw_pola.php") zawierający deklarację zmiennych i oraz funkcje get i set dotyczące tych zmiennych następującej treści:

<?php 

class ustaw_pola 
{ 

//deklaracje 
private $id_imprezy; 

//gettery i settery 
public function setId_imprezy($id_imprezy, $new_value) 
{ $this->$id_imprezy = &$new_value; } 

public function getId_imprezy(&$id_imprezy) 
{ return($this->$id_imprezy); } 

} 

?> 

oraz drugi plik("testowa.php") następującej treści:

<?php 
require("Ustaw_pola.php"); 

class testowa extends Ustaw_pola 
{ 

} 
$id_imprezy=1; 
$new_value=24; 
$test1=new Ustaw_pola(); 
echo "<html><head></head><body>"; 
$test1->getId_imprezy($id_imprezy); 
$test1->setId_imprezy(&$id_imprezy, '24'); 
print $id_imprezy; 
echo "</body></html>"; 
?> 

W funkcji set chcę ustawić wartość $id_imprezy na 24, a ciągle wynik mi zwraca wartość 1. Dlaczego?? Byłbym wdzięczny za jakąś podpowiedź!

1

Dlaczego robisz to w ogóle przez referencje? Nie rozumiem funkcji setId_imprezy(). Po co ona przyjmuje $id_imprezy? Jeszcze w getId_imprezy() jestem w stanie zrozumieć istnienie tam zmiennej przekazywanej przez referencję, ale po co tam jest return jakikolwiek w takim wypadku? Dodatkowo, ta referencja jest tam nieużywana, jeśli ja dobrze rozumiem ten kod.

Niezależnie od tego, wydaje mi się, że masz problem, który jest dość popularny w PHP - używasz $this->$id_imprezy. Takie odwołanie oznacza odwołanie się do pola obiektu $this, którego nazwa zawarta jest w zmiennej $id_imprezy. Czyli jeśli $id_imprezy wynosi 1 to odwołujesz się do $this->1, który nie ma prawa istnieć. Włącz sobie pokazywanie błędów, a zobaczysz:

PHP Warning:  Call-time pass-by-reference has been deprecated in E:\Marcin\Temp\test.txt on line 27
PHP Notice:  Undefined property: ustaw_pola::$1 in E:\Marcin\Temp\test.txt on line 13

Spróbuj zmienić w klasie Ustaw_pola z $this->$id_imprezy na $this->id_imprezy.

Dodatkowo, klasy zazwyczaj w OOP reprezentują faktyczne obiekty. Na przykład impreza jest obiektem, który posiada $id_imprezy i może mieć do niej zrobione getter i setter. Nazwa klasy Ustaw_pola jest w takim wypadku raczej niezbyt dobra, ale to chyba jakiś kod testowy.

Kończąc: linia 27 w moim kodzie to twoje $test1->setId_imprezy(&$id_imprezy, '24');. Zgodnie z tym warningiem, który mi pokazuje PHP to tutaj nie używa się już znaczka &, wystarczy przy parametrach funkcji.

0

Witajcie ponownie!
Zmieniłem kod na taki:

klasa "testowa.php":

<?php
require("Ustaw_pola.php");

class testowa extends Ustaw_pola
{

 
 }
 $id_imprezy=1;
 $new_value=24;
 $test1=new Ustaw_pola();
 echo "<html><head></head><body>";
 
 $test1->getId_imprezy($id_imprezy);
 $test1->setId_imprezy(1, 24);
 print $id_imprezy;
 echo "</body></html>";

 
 ?>

oraz:
klasa "Ustaw_pola.php":

<?php

class ustaw_pola
{
private $id_imprezy;

public function setId_imprezy($id_imprezy, $new_value)  
	{     $this->id_imprezy = $new_value; }   

	public function getId_imprezy($id_imprezy)  
	{     return($this->id_imprezy); } 
}
?>

ale nadal mam wynik zwracany jako 1, zamiast 24. Co jest jeszcze nie tak?

1

może najpierw powiedz co w ogóle chcesz zrobić, bo to co tam napisałeś to jakiś bełkot programistyczny.
może spróbuj tak:
print $test1->setId_imprezy(1, 24);

lub tak:
print $test1->id_imprezy;

lub zmień tą metodę tak:
public function setId_imprezy(&$id_imprezy, $new_value)
{
$this->id_imprezy = $new_value;
$id_imprezy = $new_value;
}

0

Powtórzę: po co tutaj są referencje? @krwq ma rację - to jest taki programistyczny bełkot.

Jeżeli zrobisz tak:

public function getId_imprezy(&$id_imprezy)  
{     
    $id_imprezy = $this->id_imprezy;
}
?>

to w tym momencie po zrobieniu:

$id_imprezy = 1;
$test->setId_imprezy(1, 24);
$test->getId_imprezy($id_imprezy);
print $id_imprezy;

Powinno zachować się jak chcesz.
Ale nie rozumiem po co jest referencja w ustawianiu id_imprezy (i tak jest nieużywana!). I nie widzę wyższości przekazywania zmiennej przez referencję w getterze zamiast zwykłego jej zwracania.

Referencji używa się w dwóch przypadkach - jeżeli potrzebujesz, aby funkcja (metoda) modyfikowała oryginalną zmienną albo jeżeli potrzebujesz, aby funkcja zwracała więcej niż jedną wartość wyjściową (i nie była to tablica). Pierwszy przypadek to na przykład funkcja do zamiany dwóch zmiennych wartościami. Drugi - zmienna wyjściowa zawierająca wynik obliczeń, a funkcja zwraca kod błędu (albo odwrotnie).

0

Jakie zadanie ma mieć metoda getIdImprezy?
Ma zwrócić liczbę calkowitą - id imprezy - tego obiektu, na rzecz którego jest wywoływana, czy może ma podstawić pod zmienną podaną w parametrze tę wartość.
Może chciałeś zamiast tak:
$test->getIdImprezy($id_imprezy);
print $id_imprezy;

zrobić tak:
print $test->getIdImprezy();

Jaki ma sens pytanie o id skoro musimy je podać?

0

A nawet inaczej (post wyżej to też ja, tylko się zarejestrowałem).
W implementacji metody getId_imprezy nie używasz w ogóle tego argumentu i zwracasz wartość id.
Dodatkowo przy wywoływaniu tej metody z obliczonego wyniku w ogóle nie korzystasz.
Drukujesz nie zmienioną wartość zmienne $id_imprezy.

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