namespaces

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi,

ich bin aus php.net nicht wirklich schlau geworden. Deshalb hier meine Frage, gibt es eine Möglichkeit die PHP-Namespaces für Klassen einzusetzen, wie infolgendem Beispiel?
PHP:
interface bar{
  const pi = 3.14;
}
class foo implements bar{
  public function get_pi(){
    return foo::pi;
  }
  public function namespace_get_pi(){
    using namespace foo;
    return pi;
  }
}

Gibt es so eine Möglichkeit (das ist jetzt mehr oder weniger C++Syntax)
 
Mir ist nix derartiges Bekannt.

Was macht der namespace bei c++ denn?

Wenn ich dein Code zu interpretieren versuch, denk ich, dass du in der Funktion namespace_get_pi() das pi des Interfaces ausgeben willst. Das kannst du auch direkt machen:
PHP:
interface bar{
  const pi = 3.14;
}
class foo implements bar{
  public function get_pi(){
    return foo::pi;
  }
  public function namespace_get_pi(){  
    return bar::pi;
  }
}
 
Zuletzt bearbeitet:
Also in diesem Fall kannst du c++ garnicht mit PHP vergleichen.

Aber ich versteh zurzeit garnicht was du bezwecken willst?
Wo liegt denn genau das Problem? Und bitte diesmal net mit
c++ Code darstellen ^^
 
Also in diesem Fall kannst du c++ garnicht mit PHP vergleichen.

Aber ich versteh zurzeit garnicht was du bezwecken willst?
Wo liegt denn genau das Problem? Und bitte diesmal net mit
c++ Code darstellen ^^

Lediglich das using namespace war C++ :D

Also, das using namespace (es gibt ja namespaces in php, nur haben die glaube ich eine andere Aufgabe) ist eigentlich eine Vereinfachung für den Coder.
PHP:
echo foo::bar;
echo foo::bar2;
echo foo::bar3;
Um sich das foo jedesmal zu sparen, kann man einen namespace nutzen.
C++:
using namespace foo;
echo bar;
echo bar2;
echo bar3;

Dies hat dann die Vorteile a) weniger schreiben zu müssen und b) falls man den Interfacenamen (warum auch immer) verändern sollte, muss man lediglich das using namespace anpassen, und nicht an n Zeilen im Code verändern, was eine leichte Fehleranfälligkeit bedeutet.
 
Achso, analog dem "with" beim VB6 ud VBA.

Mir ist nix bekannt derartiges bekannt (was aber nix heissen muss)
 
In der Online-Dokumentation von PHP steht alles wissenswerte über Namespaces in PHP (ab PHP 5.3.0 übrigens;) )

Und siehe da, in PHP muss es statt using namespace foo; heißen:

PHP:
use foo;

Wenn man schon auf php.net verweist, sollte man es vielleicht selbst vorher einmal durchlesen. use foo hat keinen Einfluss auf Klassen/Interfacekonstanten, zumindest geht das nicht aus der Dokumentation hervor. Wenn ich mich irren sollte bitte ich um Entschuldigung.
Also kommt man um den ::-Operator wohl nicht drumherum. Schade eigentlich.
 
Möchtest du auf Konstanten innerhalb von Interfaces oder Klassen zugreifen, kommst du selbstverständlich nicht um den ::-Operator, genau für diesen Zweck ist der ja da (genauso wie für statische Member).

Ich bin jetzt kein C++-Experte, aber soweit ich weiß dürfte das Namespaceverhalten doch sehr ähnlich sein, oder irre ich mich? Definiere ich beispielsweise...

PHP:
namespace std {
    function cout(string $str) {
        echo $str;
    }
}

...kann ich so auch drauf zugreifen:

PHP:
use std;

cout("Hello World!");
(vor dem std sollte hier noch ein Backslash sein, der wird aber rausgestripped..)

Und das ist letztlich nichts anderes als in C++:

C++:
#include <iostream>

using namespace std;

int main(void) {
    cout << "Hello World!";
    return 0;
}

..oder bin ich vollends verwirrt? :confused:
 
Hi

das C++ Beispiel ohne namespace wäre ja so:
C++:
#include <iostream>

int main(){
  std::cout<<"Hello World"; 
}

Auch wenn ich versuche deine Lösung auf PHP zu übertragen, wird mir nicht 3.14 sondern "pi" ausgegeben:
PHP:
<?php
namespace blub {
   interface blub{
     const pi = 3.14;
   }
   echo blub::pi;//gibt 3.14 aus
   echo pi;//gibt pi aus
}
echo pi; //Fatal error: No code may exist outside of namespace {} 
?>
Auch folgender Code zeigt keinerlei Wirkung (außer den FatalError)
PHP:
<?php
namespace blub {
   interface blub{
     const pi = 3.14;
   }
   echo blub::pi;
}
use \blub;
echo pi;
?>
 
Zurück