[PHP] Niszczenie klasy w konstruktorze

0

Witam

Pytanie jest banalne ale mam pewne braki [wstyd]
Jak <ort>zniszczeć </ort>obiekt w konstruktorze ??

Sprawdzałem w dokumentacji i unset($this) nie zadziała, $this->__destruct() będzie działało??
Co zwróci takie wywołanie??

0
ktosi napisał(a)

Co zwróci takie wywołanie??

Sprawdź.

0

niszczyć obiekt w konstruktorze ?
czy na pewno ten obiekt ci jest w ogóle potrzebny ? :|

0

i nic tz najprawdopodobniej nie niszczy klasy bo dostajeCatchable fatal error: Object of class DiscFile could not be converted to string in E:\Programy\WebServ\httpd\lern\condesc.php on line 16 przy próbie wyświetlenia zmiennej w której już nie powinno byc klasy tylko jakiś NULL czy coś.

KOD

class DiscFile{
	
	function __construct(){
		echo "construct<br/>";
		$this->__destruct();
	}
	function __destruct(){
		echo "destruct<br/>";
	}
}

	$a=new DiscFile;
	echo $a;

//Edit
Obiekt jest potrzebny.

0

bo nie niszczysz obiektu tylko wywołujesz funkcję destruktora jak zwyczajną funkcję
poza tym zapewniam cię że NIE potrzebujesz tego obiektu

0

hmm... w każdym razie moja koncepcja potrzebuje;P

bo nie niszczysz obiektu tylko wywołujesz funkcję destruktora jak zwyczajną funkcję
Tz co mam zrobić?? unset($this) nie mogę.

0

Nie ma takiej mozliwosci zebys zniszczył obiekt, z poziomu jego konstruktora.. to jest bezsensu ;|
Na pewno możesz (własciwie musisz) rozwiazac to inaczej.

0

Wytlumacz logicznie jaki wedlug Ciebie powinien byc stan obiektu, kiedy zakonczy sie konstruktor? Obiekt istnieje czy nie istnieje? ;)

0

Ktosi, powiedz mi, jak chcesz zniszczyć coś, co nie istnieje?

ktosi napisał(a)

hmm... w każdym razie moja koncepcja potrzebuje;P

Masz do wyboru dwa podejścia:

  • zmienić koncepcję swojego programu
  • zmienić koncepcję języka progrmowania, tj. stworzyć swój własny.
0

zapewniam cię że NIE potrzebujesz tego obiektu
W tym wypadku obiektu jak najbardziej potrzebuje.

Wytłumacz logicznie jaki według Ciebie powinien byc stan obiektu, kiedy zakończy się konstruktor? Obiekt istnieje czy nie istnieje? ;)

Ogólnie chodziło aby utworzenie kilku identycznych interfejsów. Ma to na celu przechowywanie plików w bazie i na dysku (w przyszłości mam zamiar dodać więcej opcji). Skrypt sprawdza który jest już zaimplementowany w konstruktorze/czy pewna grupa takich plików została już utworzona w danej przestrzeni. I teraz ta część koncepcji. Jeśli grupa nie została utworzona obiekt nie powinien się utworzyć. A program w pewnych okolicznościach sprawdza kolejny interfejs.
Nie zagłębiam się dokładnie w szczegóły i zastosowanie bo dużo pisania by było;P

Ten sposób wydaje mi się najlepszy z uwagi na znaczne skrócenie kodu.
Nie miało to do końca wyglądać tak jak napisze ale dam przykład:

$zm=new Inter1;
if($zm->init)return $zm
unset($zm);

...
if($zm=new Inter1) return $zm;
A mogło być tak pięknie:}

Ktosi, powiedz mi, jak chcesz zniszczyć coś, co nie istnieje?

Jak jesteś w konstruktorze to i ustawiasz zmienne tego "nieistniejącego" obiektu, to obiekt już chyba istnieje czy jeszcze nie?? Nie mam pojęcia po co ten cytat. Co najmniej wyrwany z kontekstu.

RE:asdf
Cóż będę musiał. Wyżej nawet napisałem jak.

PS.Mam prośbę do administratora. Gdy szukałem odpowiedzi na to pytanie, nigdzie nie znalazłem informacji że tego się nie da zrobić. Temat może nie stoi na zbyt wysokim poziomie ale może warto by było zachować go w Webmasting. Tym bardziej że 4p zawsze stoi dość wysoko w google. Kto wie może kiedyś się przyda innemu początkującemu.
// faktycznie, temat jest całkiem wartościowy, ale bardziej dotyczy IO niż języka PHP jako takiego - K

0
ktosi napisał(a)

Ktosi, powiedz mi, jak chcesz zniszczyć coś, co nie istnieje?

Jak jesteś w konstruktorze to i ustawiasz zmienne tego "nieistniejącego" obiektu, to obiekt już chyba istnieje czy jeszcze nie?? Nie mam pojęcia po co ten cytat. Co najmniej wyrwany z kontekstu.

Nie jest wyrwany. Obiekt w jezykach c-podobnych zaczyna zyc po tym jak zakonczy sie konstruktor. Wczesniej nie istnieje. Jest to pewna konwencja, ktora nie pozwala na stworzenie obiektu czesciowo, np. w przypadku wyjatku rzuconego w konstruktorze. Stad i moje pytanie bylo. Jak sobie wyobrazasz sytuacje, ze konstruktor zakonczyl sie poprawnie i nie stworzyl obiektu? To zakonczyl sie poprawnie czy nie? Jak zareaguje programista, ktory uzyje konstrukcji new i nie dostanie spodziewanego wyniku?

Odpowiedzia na Twoj problem jest wzorzec Budowniczego na przyklad. Cos w stylu funkcji/metody GetFirstFitObject. Przekombinowujesz, zeby ulatwic sobie zycie nie zdajac sobie sprawy, ze kopiesz pod soba dolek. Taka konstrukcja powinna byc intuicyjna. W tym wypadku przeladowanie zachowania konkstruktora, ktore to zachowanie jest jedno i tylko jedno, zdecydowanie zaciemnia obraz sytuacji.

0

Zdecydowanie, konstruktor jak coś uzna za nie halo, to powinien uczciwie rzucać wyjątkiem. Jeśli na swoim stylu ci zależy, to przynajmniej tak to ujmij, i używaj metody create, a reszta niech spokojnie z konstruktorem żyje bez obaw.

class Object {

    // normalny konstruktor, rzuca wyjątkiem, jeśli coś mu nie idzie
    public function __construct($param) { 
        if($param<0) {
            throw new Exception("Object: invalid param value: $param");
            }
        }
        
    // funkcja która ciebie bardziej satysfakcjonuje chyba
    public static function create($param) {
        try {
            return new Object($param);
            } 
        catch(Exception $e) {
            return NULL;
            }
        }
    };

try {
    $a = Object::create(+5);
    $b = Object::create(-5); // zwróci NULL
    $c = new Object(+4);  
    $d = new Object(-4); // rzuci wyjątkiem
    }
catch(Exception $e) {
    // uczciwa obsługa błędów - w exceptions
    echo $e->getMessage() . '<br>';
    }
    
// a tutaj to twoje
if($a) { echo "A "; }
if($b) { echo "B "; }
if($c) { echo "C "; }
if($d) { echo "D "; }

btw: czy to ci jakąś różnicę robi, czy zmiennej nie będzie, czy też będzie, ale z wartością NULL ? Twoja hipotetyczna konstrukcja w każdym razie będzie działać:

if( $v=Object::create(5) ) return $v;
0
reg4daewooS napisał(a)

niszczyć obiekt w konstruktorze ?
czy na pewno ten obiekt ci jest w ogóle potrzebny ? :|

Nie chodzi mu pewnie o sam fakt niszczenia go, tylko może próbuje stworzyć coś podobnego do klasy abstrakcyjnej?

ktosi napisał(a)

Ogólnie chodziło aby utworzenie kilku identycznych interfejsów. Ma to na celu przechowywanie plików w bazie i na dysku (w przyszłości mam zamiar dodać więcej opcji). Skrypt sprawdza który jest już zaimplementowany w konstruktorze/czy pewna grupa takich plików została już utworzona w danej przestrzeni. I teraz ta część koncepcji. Jeśli grupa nie została utworzona obiekt nie powinien się utworzyć. A program w pewnych okolicznościach sprawdza kolejny interfejs.

Warunkowe tworzenie obiektu?

class DiscFile{
        function __construct(){
                throw new Exception('Nie utworzę obiektu!');
        }
}

try {
        $a=new DiscFile();
        echo $a;
} catch (Exception $e) {
        echo $e;
}

// Edit: pośpieszyłem się, odpowiedziałem a przecież nie doczytałem do końca wątku. Może moja odpowiedź się przyda :P

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