php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-10-2007, 22:28
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard [OOP] Beliebige Type Casts

Hallo Problemlöser und Neugierige,

Ich arbeite momentan an meiner Klasse Table, die ne vorarbeit und Basisklasse für spätere Sachen darstellt.
Um euch einen kleinen Überblick zu verschaffen, hab ich hier mal das Klassendiagramm:



mit diesem Teil kann man momentan folgendes machen:
PHP-Code:
$head = new Row(2);
$head->getCell(0)->set("Spalte1");
$head->getCell(1)->set("Spalte2");
$table = new Table(2,$head);
$table->getRow(0)->getCell(0)->set("Inhalt1");
$table->getRow(0)->getCell(1)->set("Inhalt12");
$table->getRow(1)->getCell(0)->set("Inhalt21");
$table->getRow(1)->getCell(1)->set("Inhalt22");
echo 
$table
was dann folgendes ergebnis liefert:
Spalte1|Spalte2|
-
Inhalt1|Inhalt12|
Inhalt21|Inhalt22|

soweit so gut, aber ihr hab euch bestimmt schon gefragt
"warum macht der kerl da ein interface RowData rein??!!"

aus einem ganz einfachen grund:
so wies jetz aufgebaut ist könnte ich mir ja ganz einfach per
getRow ne Row schnappen und die um eine zelle mit addCell
erweitern.
Das darf aber nich möglich sein, nur addColumn darf die Rows in
der Table um eine Zelle erweitern.
Darum wollte ich ja auch mit getRow ein Objekt des Typs RowData
zurückgeben damit man später nur noch ein Zelle auslesen oder
verändern kann.

In c# oder java wär das ja kein problem weil ich da einfach RowData
casten würde.
Ich hab schon gegoogelt und im forum steht zu "cast" fragen nichts
konkretes drinne =(
Gibt es da irgendwas, was ich übersehn hab oder funktioniert das in
PHP nur mit einem workaround??
Mit Zitat antworten
  #2 (permalink)  
Alt 10-10-2007, 22:54
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

PHP-Code:
 class bla
{
  public function 
getRow(RowData $var)
  {
     
// tuwas mit $var
  
}

Nur so kannst du in PHP Datentypen erzwingen..
Alles andere ist "Handarbeit".
__________________
Wir werden alle sterben

Geändert von combie (10-10-2007 um 22:56 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 10-10-2007, 22:59
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

kommt mir bekannt vor xD
klappt nur leider nich weil anscheinend wieder impliziert auf row konvertiert =(

PHP-Code:
public function addRow(RowData $r=null){
        if(
$r==null){
            
$this->addRow(new Row($this->getColumns()->getCount()));
        } elseif(
$r instanceof RowData){
            if(
$r->getCount()==$this->getColumns()->getCount()){
                
$this->_rows[]=$r;
            } else {
                throw new 
Exception("Row doesn't fit in table");
            }
        } else {
            throw new 
Exception("Invalid type of parameter");
        }
        
    } 
Mit Zitat antworten
  #4 (permalink)  
Alt 10-10-2007, 23:18
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

RowData $r=null
Nein, Es gibt keine Null Objekte in PHP!
__________________
Wir werden alle sterben
Mit Zitat antworten
  #5 (permalink)  
Alt 10-10-2007, 23:25
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

OffTopic:
hab ich auch nie behauptet
jedoch kann $r den wert null annehmen...
zudem kann ich nur sagen: works as designed
wenn ich addRow() aufrufe wird ganz normal ne Row eingefügt

edit: das null objekt als entwurfsmuster gibt es in php

Geändert von BugBite (10-10-2007 um 23:28 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 11-10-2007, 11:20
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von combie
RowData $r=null
Nein, Es gibt keine Null Objekte in PHP!
Null ist kein Objekt, aber du kannst einem getypten Parameter null als Standardwert geben, so dass dieser Wert optional wird.
Mit Zitat antworten
  #7 (permalink)  
Alt 11-10-2007, 12:21
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
edit: das null objekt als entwurfsmuster gibt es in php
Rückwärsgang: Ja du darfst dein "NULL Objekt" so verwenden..

PHP ist in dem Punkt leider etwas krank(finde ich)..
Das Handbuch sagt:
Zitat:
Type Hints can only be of the object and array (since PHP 5.1) type.
Aus: http://www.php.net/manual/en/languag...ypehinting.php

PHP-Code:
class bli {}

class 
test
{
  public function 
blabli $var=NULL)
  {
    echo 
'hello bla ';
  }
  public function 
blubli $var)
  {
    echo 
'hello blu ';
  }
}
$t = new test;
$b = new bli;
$t->bla(NULL); // funktioniert
$t->blu(NULL); // wirft Fehler 
Und dieser Code zeigt, dass NULL kein passendes Objekt ist.
Aber machmal eben doch
Warum einmal NULL verwendet werden darf und das andere Mal nicht, sehe ich nicht ein!
(aber wieder was dazu gelernt)
__________________
Wir werden alle sterben

Geändert von combie (11-10-2007 um 12:39 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 11-10-2007, 13:36
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

was mich aber bei PHP ein wenig ergert, dass es wirklich in vergleich zu den anderen sprachen nicht jeder casting funktioniert.
ich finde das nicht gut, dass ich ein object nicht auf seine basisclasse kasten kann, was natürlich bei C#.Java, C++ problemlos funktioniert.
PHP-Code:
class t1 {
  function 
f1(){echo 't1';}
}
class 
t2 extends t1{
  function 
f1(){echo 't2';}
}

 
$t=new t2;

//das wird bei php5.1 nicht funktionieren
//ich kann hier nur auf Array, String oder Object casten, aber nicht auf die 
//basisclasse
 
$a= (t1)$t
warum das so ist, habe ich wirklich keine Erklärung.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #9 (permalink)  
Alt 11-10-2007, 14:41
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Die Möglichkeit eigene Typecast zu definieren (neben __toString auch noch __toInt / __tot1) wurde für PHP 6 leider abgelehnt ...
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #10 (permalink)  
Alt 11-10-2007, 15:31
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

PHP-Code:
class t1 {
  function 
f1(){echo 't1';}
}
class 
t2 extends t1{
  function 
f1(){echo 't2';}
}

 
$t=new t2;

function 
test(t1 $var)
{
  
$var->f1();
}
test($t); 
Mit dem Typehinting kann man auf Basisklassen und Interfaces testen, das soll reichen. Dass man "von aussen" nicht auf überschriebene Methoden der Basisklasse zugreifen kann, finde ich OK!
__________________
Wir werden alle sterben
Mit Zitat antworten
  #11 (permalink)  
Alt 11-10-2007, 18:23
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

is ja schön das du das ok findest, jedoch find ich es ziemlich dämlich
in einer programmiersprache interfaces und vererbung anzubieten,
ohne dann die polymorphie vollständig zu unterstützen.
Und casting is da einfach ne essentielle komponente.

@ Slava
/signed

naja damit wäre ja dann meine frage diesbezüglich wohl beantwortet.
ich bedanke mich und werde einfach mein modell ein wenig abändern,
also anstatt einer get row eine fetchRow methode anbieten, die eine kopie der geforderten Row ausgibt, und weiterhin eine set(r,c) und get(r,c) methode zum lesen und setzen der werte meiner tabelle
verwenden
Mit Zitat antworten
  #12 (permalink)  
Alt 11-10-2007, 18:34
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

edit: doppelpost verfluchtes wackel wlan

Geändert von BugBite (11-10-2007 um 18:44 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 11-10-2007, 19:17
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
ohne dann die polymorphie vollständig zu unterstützen.
Das tun eigendlich nur ganz wenige Sprachen! z.B. C++ geht dort recht weit.
Selbst so moderne Sprachen wie Java machen das nicht.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #14 (permalink)  
Alt 11-10-2007, 20:51
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Hi combie
Java macht das garantiert.
Ob das C# macht, muss ich gleich testen, aber ich bin mir sicher, dass C# das auch wie java unterstützt.
nach dem testen sage ich wegen c# bescheid.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #15 (permalink)  
Alt 11-10-2007, 21:17
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Ja, wie ich auch erwartet habe funktioniert casting auch in C#
PHP-Code:
public class test{
  static 
void Main(string[] args){
  
Class2 c=new Class2();
//hier kommt es zu ausgabe "Class1" da es gekastet wurde
  
Console.Write(((Class1)c).t1());
  
Console.Read();
  }
}
    
public class 
Class1
{
  public 
Class1(){}

  public 
string t1(){    return "Class1";}
}

//vererben    
public class Class2 Class1
{
  public 
Class2(){}
  public 
string t1(){    return "Class2";}

__________________
Slava
bituniverse.com
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:44 Uhr.