Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] handler funkcji w klasie
flashdev
post 3.07.2009, 17:21:19
Post #1





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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?


--------------------
Go to the top of the page
+Quote Post
erix
post 3.07.2009, 17:25:05
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
flashdev
post 3.07.2009, 17:40:57
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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";
    }
}

?>


Ten post edytował flashdev 3.07.2009, 17:41:12


--------------------
Go to the top of the page
+Quote Post
erix
post 3.07.2009, 19:10:40
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

Również w konstruktorze.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
wookieb
post 3.07.2009, 20:51:58
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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. ?>


Ten post edytował wookieb 3.07.2009, 20:52:40


--------------------
Go to the top of the page
+Quote Post
erix
post 3.07.2009, 20:53:17
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
wookieb
post 3.07.2009, 20:58:11
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wiec twój poprzedni post można uznać za niepotrzebny smile.gif Ba. Nabijający licznik tak jak ten smile.gif


--------------------
Go to the top of the page
+Quote Post
flashdev
post 18.07.2009, 20:22:53
Post #8





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.

Ten post edytował flashdev 18.07.2009, 20:23:45


--------------------
Go to the top of the page
+Quote Post
erix
post 18.07.2009, 20:30:21
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
flashdev
post 18.07.2009, 20:39:11
Post #10





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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


--------------------
Go to the top of the page
+Quote Post
wookieb
post 18.07.2009, 20:44:16
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 :/

Ten post edytował wookieb 18.07.2009, 20:54:44


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 06:50