Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] handler funkcji w klasie
Forum PHP.pl > Forum > Przedszkole
flashdev
Piszęe klasę do obsługi błędów w php i mam mały problem.

Kod
function error_handler(..){
...
}
set_error_handler(error_handler);


ten kod mi działa, ale jak chce podać uchwyt do funkcji w klasie to jest problem

Kod
// tak nie dziala:
set_error_handler($this->error_handler);
// tak tez nie:
set_error_handler("$this->error_handler");


Jestem przyzwyczajony do JS i tam normalnie nazwa funkcji bez nawiasów jest do niej uchwytem.
A w php np. ponizsze wyrazenie jest prawdziwe:
Kod
echo gettype(abc)==gettype("abc");


Czyli pomimo ze mam w kodzie funkcje abc, to php traktuje to jako string, a nie uchwyt.

Jak rozwiazac ten problem, jak odwolac sie do tej funkcji w klasie?
erix
  1. <?php
  2. set_error_handler(array($this, 'error_handler'));
  3. ?>

snitch.gif

Taka sama składnia jest dla call_user_func" title="Zobacz w manualu PHP" target="_manual; we wszystkim, do czego podajesz jakiś callback.
flashdev
Można prosić o mały feedback co robie źle?

Kod
<?php
include("class_error_reporting.php");
$error_rep = new class_error_reporting();

//asd
?>


Kod
<?php

class class_error_reporting {

    function __construct(){
        //set_error_handler(array($error_rep, 'error_handler'));
        set_error_handler(array($this, 'error_handler'));
    }

    function error_handler($errno, $errstr, $errfile, $errline, $errcontext){
        echo "$err_no = ".$errno."\n";
        echo "$err_str = ".$errstr."\n";
        echo "$err_file = ".$errfile."\n";
        echo "$err_line = ".$errline."\n";
        echo "$err_context = ".$errcontext."\n";
        echo "------------------------------"."\n";
    }
}

?>
erix
W swoich skryptach miewałem to mniej więcej tak:
  1. <?php
  2. set_error_handler(array(&$this, 'catchPhpError'));
  3. ?>

Również w konstruktorze.
wookieb
Cytat(erix @ 3.07.2009, 20:10:40 ) *
  1. <?php
  2. set_error_handler(array(&$this, 'catchPhpError'));
  3. ?>


Raczej w czasach php4 smile.gif Panie Erixie smile.gif

~Flashdev pamietaj ze error handler dotyczy tylko części błędow.

Cytat
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.


Poza tym masz błędy typu 'Undefined variable $err_no', wiec musisz użyc ' zamiast ", reszta jest ok. Pomijając, że źle wyświetlasz niektóre zmienne.

  1. <?php
  2. class class_error_reporting {
  3.  
  4.    function __construct(){
  5.        //set_error_handler(array($error_rep, 'error_handler'));
  6.        set_error_handler(array($this, 'error_handler'));
  7.    }
  8.  
  9.    function error_handler($errno, $errstr, $errfile, $errline, $errcontext){
  10.        echo '$err_no = '.$errno.'\n';
  11.        echo '$err_str = '.$errstr.'\n';
  12.        echo '$err_file = '.$errfile.'\n';
  13.        echo '$err_line = '.$errline.'\n';
  14.        echo '$err_context = '.$errcontext.'\n';
  15.        echo '------------------------------'.'\n';
  16.    }
  17. }
  18.  
  19. new class_error_reporting();
  20.  
  21.  
  22. trigger_error('heheh', E_USER_NOTICE);
  23. ?>
erix
To ze starego skryptu wycięte; zresztą nie zrobi różnicy - w obu przypadkach (PHP4/5) będzie wówczas referencja. tongue.gif

edit@down: przy jego obecnej wartości to już chyba nie ma znaczenia... ;p
wookieb
Wiec twój poprzedni post można uznać za niepotrzebny smile.gif Ba. Nabijający licznik tak jak ten smile.gif
flashdev
Mam kolejny bardzo podobny problem, z którym nie mogę sobie poradzić.

Mam dwie klasy: B i A.

tworzę obiekt klasy A:
$objA = new A();

I teraz zauważyłem, że w klasie A mam bardzo fajną funkcję o nazwie funkcja, którą chciałbym wykorzystać w klasie B.

Jak teraz przekazać tą referencję parametrze konstruktora klasy B, żebym mógł sobie zapisać ten uchwyt w zmiennej, a anastępnie używać do woli.
$objB = new B( questionmark.gif );

Podaje kawałek kodu AS3 (~JS) wyjaśniającego o co mi chodzi. Może ktoś mnie zrozumie.
Kod
var klasaA:A = new A();
var klasaB:B = new B( klasaA.funkcja );

// zmienna oraz kostruktor w klasie B:
var private uchwyt:function;
function B( h:function ):void{
uchwyt = h;
}

// przykladowe wywolanie fajnej funkcji z klasy A w klasie B:
function exec():void{
uchwyt();
}


Może nie do końca wszystko rozumiem jak to się robi w php. Może nikt o zdrowych zmysłach nie wykonuje funkcji z klasy A w klasie B.
Jeśli tak jest to prosiłbym o jakieś wskazówki w postaci linków do wartościowych artykułów wprowadzajacych w temat php.
erix
Uchwyt przekazujesz tak, jak dowolną zmienną.

Czyli do konstruktora podstawiasz zmienną, która trzyma potrzebną Ci klasę, konstruktor ustawia odpowiednią własność w klasie, a pozostałe funkcje z tej klasy korzystają z własności.
flashdev
Cytat(erix @ 18.07.2009, 21:30:21 ) *
Uchwyt przekazujesz tak, jak dowolną zmienną.

Czyli do konstruktora podstawiasz zmienną, która trzyma potrzebną Ci klasę, konstruktor ustawia odpowiednią własność w klasie, a pozostałe funkcje z tej klasy korzystają z własności.


W tej chwili podałeś mi przepis na przekazanie referencji do klasy z czym potrafię sobie już poradzić na tym etapie przygody z php.

Proszę o przeczytanie mojego bełkotu ze zrozumieniem winksmiley.jpg
wookieb
Np
  1. <?php
  2. $klasaA=new A();
  3.  
  4. $klasaB=new B($klasaA);
  5.  
  6.  
  7. // W klasie B używasz tego tak
  8. $wynik=call_user_func($this->uchwyt);
  9. ?>


Albo zrobisz ta metodę jako statyczną i wtedy tylko
  1. <?php
  2. A::funkcja();
  3. ?>


Trzecia opcja to

  1. <?php
  2. $klasaA=new A();
  3.  
  4. $klasaB=new B(array($klasaA, 'funkcja'));
  5.  
  6.  
  7. class B
  8. {
  9. public function __construct(A $a)
  10. {
  11. $this->klasa=$a;
  12. }
  13.  
  14. public function test()
  15. {
  16. $this->klasa->funkcja();
  17. }
  18. }
  19. ?>


Niestety w php nie ma tak fajnych callbacków jak choćby w AS3 :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.