php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 1,00 durchschnittlich.
Alt 03.02.2012, 09:28  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard Zugriff aus anonymen Funktionen auf private statische Methoden innerhalb der Klassen

Mit self:: hab ich ja Zugriff innerhalb Klassendefinition, nicht jedoch aus anonymen Funktionen, da dort der class scope nicht aktiv ist. Wenn ich die Methode als public declariere, ist der Zugriff auch aus anonymen Funktionen möglich:
PHP-Code:
class c1 {
  public static function 
foo(){
    
$fkt = function() {
      
//self::bar("funktioniert nicht");

      
c1::bar('Variante 1:call ec2 from ec1');

      
$className __CLASS__;
      
$className::bar('Variante 2:call ec2 from ec1');
    };
    
$fkt();
  }
  
  public static function 
bar($m){
    echo 
$m.'<br>';
  }
}
c1::foo(); 
Das macht jedoch nur Sinn, wenn die Methode auch außerhalb der Klassendefinition nutzbar sein soll. Wenn ich die Methode foo nun als privat declariere, funktioniert dies so nicht.
Ich suche nach einer Möglichkeit speziellen Code in privaten Methoden/Funktionen zu bündeln und den möglichst 'global' innerhalb der Klassendefinition verfügbar zu haben.
Oder als Frage:
Gibt es eine Möglichkeit, auf private statische Methoden aus anonymen Funktionen zugreifen und wie sieht das aus?

LG jspit
jspit ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.02.2012, 09:40  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Scopes durchreichen kannst du nicht, wenn du in einem Function-Scope einen Object-Scope erwartest lief wohl was gedanklich falsch.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 03.02.2012, 09:46  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Nein, innerhalb der Closure bist du in einem eigenen Scope und das einzige was du da mit "use" hineinbringen kannst sind Variablen.
Zitat:
Ich suche nach einer Möglichkeit speziellen Code in privaten Methoden/Funktionen zu bündeln und den möglichst 'global' innerhalb der Klassendefinition verfügbar zu haben.
An dieser Stelle würde ich das Konzept mal überdenken. Was sind das für anonyme Funktionen dass sie Zugriff auf private Klassenmethoden brauchen? Und müssen es wirklich anonyme Funktionen sein?
fab ist offline   Mit Zitat antworten
Alt 03.02.2012, 11:16  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

private und static beißt sich ... static heißt, die Funktion arbeitet ohne aktives Objekt und damit MUSS sie sichtbar sein - private wiederum macht nur Sinn, wenn Objekte erstellt werden
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 03.02.2012, 11:30  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Z.B. als Helfer-Funktion für eine als public static deklarierte Methode wäre private static doch denkbar? Aber du hast wahrscheinlich Recht, dass es in den meisten Fällen passendere Lösungen gibt und "private static" nach Designfehler riecht.
fab ist offline   Mit Zitat antworten
Alt 03.02.2012, 11:38  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
private und static beißt sich ... static heißt, die Funktion arbeitet ohne aktives Objekt und damit MUSS sie sichtbar sein
Nein, private Statische Properties der Klasse beißen sich genauso wenig wie private statische Methoden der Klasse, sie werden halt Klassenintern verwendetet, in welchem Weg auch immer. Und auch nur da, vererbst du murks klebt privates da wo es soll.

Zitat:
Zitat von eagle275 Beitrag anzeigen
private wiederum macht nur Sinn, wenn Objekte erstellt werden
Nein, private ( oder protected ) macht dann sinn wenn du vererbst ( oder nicht ) und du verhindern willst das Kind-Klassen properties modifizieren.

Zitat:
Zitat von fab Beitrag anzeigen
Z.B. als Helfer-Funktion für eine als public static deklarierte Methode wäre private static doch denkbar? Aber du hast wahrscheinlich Recht, dass es in den meisten Fällen passendere Lösungen gibt und "private static" nach Designfehler riecht.
Kann man so denke ich nicht übers Knie brechen, da man sich nicht sichtbarkeiten von Methoden ansehen sollte wenn man über das Design diskutiert und bewertet sondern die gesamte Klasse.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 03.02.2012, 11:51  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Deshalb habe ich es sehr vorsichtig ausgedrückt. Aber nimm das Beispiel vom TE: da soll eine private Klassenmethode aus einer anonymen Funktion heraus aufgerufen werden. Mindestens eins von beiden ist da fehl am Platz. Und da frage ich mich auch, was die Motivation hinter private static war. "speziellen Code bündeln" sagt alles und nichts.
fab ist offline   Mit Zitat antworten
Alt 03.02.2012, 11:52  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

vermutlich hast du recht Tr0y - da ich den wirklichen Design-Fehler in den anonymen Funktionen sehe - die hab ich in über 25 Jahren programmieren NIE gebraucht (und davon 18 Jahre mit OOP)
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 03.02.2012, 12:05  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

Ja, mit dem Konzept überdenken liegt man fast immer richtig. Aber Spaß beiseite.
Es müssen auch nicht anonyme Funktionen sein.
Im konkreten Fall brauche ich Callbackfunktionen für preg_replace_callback, die ich in verschiedenen Methoden
benötige. Ich habe diese erstmal als private declariert, funktioniert auch.
Da sind aber solche Konstrukte dabei, die mir aber nicht gefallen (Ist mir zuwieder, solche Krümel als Methode zu deklarieren):
PHP-Code:
private function callback1($m){
    return 
'=> "'.self::uniSearch($m[1]).'"';

Diese wollte ich durch eine anonyme function beim Aufruf von preg_replace_callback ersetzen.
Das klappt sogar, wenn ich uniSearch als public deklariere. Das möchte ich aber auch nicht,
da nur Methoden von "außen" aufrufbar sein sollen, die auch Sinn machen.
Meine Hoffnung war, daß es da noch ein Trick gibt self in den Function-Scope zu schmuggeln.
jspit ist offline   Mit Zitat antworten
Alt 03.02.2012, 12:12  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Würdest du so etwas schöner finden?
PHP-Code:
class Whatever
{
  private static function 
uniSearchCallback()
  {
    return function(
$param) {
      
// hier deine ursprüngliche uniSearch-Funktion
    
}
  }
  public static function 
somePublicMethod()
  {
    
$uniSearch self::uniSearchCallback();
    
$f = function($m) use ($uniSearch) {
      return 
'=> "' $uniSearch($m) . '"';
    }
    
preg_replace_callback(..., $f);
  }

fab ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Unittests mit private Methoden coola PHP Einsteiger 8 31.01.2011 15:02
[Erledigt] statische klassen immer sinnvoll ? Codercrush PHP-Fortgeschrittene 14 17.09.2010 16:44
[Erledigt] Vererbung - Zugriff auf Elternmethoden nicht möglich unimow PHP Tipps 2008 5 03.11.2008 18:53
public, protected, private Funktionen ecomeback PHP Tipps 2007 10 21.08.2007 02:21
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
Zugriff auf statische methoden oder konstanten nightfreak PHP-Fortgeschrittene 6 14.11.2005 16:56
Code Syntax Highlighting imported_Lumio PHP-Fortgeschrittene 9 16.08.2005 11:06
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
was bringt private static, php zugriff auf static, globale anonyme variante nicht static

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:51 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum