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
  #16 (permalink)  
Alt 18-04-2011, 21:20
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Ganz sicher? Von welchem Java-Clone redest du?
Ich habe nicht gesagt, dass Java das Überladen von (Zuweisungs)operatoren unterstützt. Aber es weist in diesem Fall genau das Verhalten auf, welches ich in PHP (falls möglich über eine magische Methode) simulieren wollte.

Ob es noch das selbe oder ein neues Objekt ist spielt für meinen Zweck keine Rolle. Wichtig ist nur, dass es ein Objekt bleibt. Da genau das aber standardmässig in PHP aufgrund der fehlenden Typisierung nicht möglich ist, dachte ich an die Option der magischen Methoden.

Für mein Experiment werde ich einfach weiterhin $obj.set($v); oder $obj($v); statt $obj=$v; nutzen
Mit Zitat antworten
  #17 (permalink)  
Alt 18-04-2011, 21:46
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von sili Beitrag anzeigen
Ich habe nicht gesagt, dass Java das Überladen von (Zuweisungs)operatoren unterstützt. ...
Ja, das hab ich auch zwischenzeitlich bemerkt.
Mit diesem überladbaren Zuweisungsoperator steht und fällt aber dein Interpretationsversuch deines Quellcodebeispiels. Ohne macht es nicht, was du denkst, das es täte ...

Zitat:
... Aber es weist in diesem Fall genau das Verhalten auf, welches ich in PHP (falls möglich über eine magische Methode) simulieren wollte.
Nee, nee, nee -- tut es eben nicht.

Zitat:
Ob es noch das selbe oder ein neues Objekt ist spielt für meinen Zweck keine Rolle. Wichtig ist nur, dass es ein Objekt bleibt.
Mal ernsthaft: Was sollte es für einen Sinn ergeben, zuerst einer Variablen einen Wert zuzuweisen, nur um ihr danach einen typgleichen aber anderen Wert zuzuweisen, damit man anschließend so tun kann, als rufe man die Methoden des ersten zugewiesenen Wertes auf?

Zitat:
Da genau das aber standardmässig in PHP aufgrund der fehlenden Typisierung nicht möglich ist, ...
Doch ist es. Mit der Typisierung hat das nichts zu tun. PHP ist typisiert (was auch immer du darunter verstehen magst) ...

PHP-Code:
// etwas Vorbereitung:

class Bar {
    function do() {}
}

class 
Foo extends Bar {
}

// Dein Beispiel:

$v = new Foo();

// $v = 'bar';
$v = new Bar('bar');

$v->do(); 
Das funktioniert, aber der praktische Nutzen erschließt sich mir um diese Uhrzeit nicht ...
Erleuchte mich.

Zitat:
Für mein Experiment werde ich einfach weiterhin $obj.set($v); oder $obj($v); statt $obj=$v; nutzen
Suchst du etwa alternative Konstruktor-Funktionen?

$obj.set($v) dürfte einen Fehler geben (PHP benutzt "->" zum Ansprechen von Objekt-Eigenschaften. "." ist der Stringverkettungsoperator.

$obj($v) funktioniert seit einiger Zeit, wenn das Objekt die magische Methode __invoke() besitzt. Das ist ein Nebeneffekt der Einführung von Closure-Objekten.

Geändert von fireweasel (18-04-2011 um 21:49 Uhr)
Mit Zitat antworten
  #18 (permalink)  
Alt 18-04-2011, 22:12
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich glaube, ich muss mein Vorhaben etwas erläutern
PHP5 unterstützt Type Hinting bei den Methodenparameter für Objekte und Arrays, jedoch nicht für primitive Datentypen. Diese Einschränkung würde ich gerne mithilfe einiger Wrapper-Klassen umgehen um so etwas machen zu können:
PHP-Code:
class {
    public function 
b(Integer $x)
    {
        ...
    }

Dafür suche ich Wege um den Umgang mit den Wrapper-Klassen bzw. dessen Objekten möglichst zu vereinfachen. Bei der Ausgabe lässt sich in einigen Fällen mit __toString() nutzen (zumindest wenn ein String benötigt wird), ansonsten gibt es eine get() Methode. Um einen Wert neu zu setzen wird set() verwendet und genau diesen Teil wollte ich nach Möglichkeit vereinfachen.

Aber wie gesagt: Über den Sinn oder Unsinn solcher Wrapper-Klassen müsst ihr euch im Übrigen keine Gedanken machen. Es geht nur um ein Experiment um den Umgang mit den primitiven Datentypen zu vereinfachen

Geändert von sili (18-04-2011 um 22:14 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 18-04-2011, 22:30
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von sili Beitrag anzeigen
Ich glaube, ich muss mein Vorhaben etwas erläutern
PHP5 unterstützt Type Hinting bei den Methodenparameter für Objekte und Arrays, jedoch nicht für primitive Datentypen. Diese Einschränkung würde ich gerne mithilfe einiger Wrapper-Klassen umgehen ...
[ ] Du hast schonmal was von den SPL-Wrapper-Klassen für die "primitiven" Datentypen in PHP gehört.

Geändert von fireweasel (18-04-2011 um 22:33 Uhr)
Mit Zitat antworten
  #20 (permalink)  
Alt 19-04-2011, 10:53
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
[ ] Du hast schonmal was von den SPL-Wrapper-Klassen für die "primitiven" Datentypen in PHP gehört.
Ja hab ich. Dabei handelt es sich aber um eine experimentelle, mehr als drei Jahre alte PECL-Erweiterung mit sehr eingeschränkter Funktionalität. Der Vorteil davon ist jedoch, dass genau die Anfangsfrage damit geklärt werden würde. Trotzdem mache ich das lieber von Hand: Die paar Klassen sind schnell selbst geschrieben und mit dem Nachteil der fehlenden Möglichkeit der direkten Wertzuweisung kann ich leben. Zusätzlich kann ich die "Bibliothek" (wenn man das so nennen kann) einfacher verteilen, da keine zusätzlichen Erweiterungen installiert werden müssen.
Mit Zitat antworten
  #21 (permalink)  
Alt 19-04-2011, 15:00
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Zitat:
Zitat von sili
Aber wie gesagt: Über den Sinn oder Unsinn solcher Wrapper-Klassen müsst ihr euch im Übrigen keine Gedanken machen. Es geht nur um ein Experiment um den Umgang mit den primitiven Datentypen zu vereinfachen
Du kannst dich darauf einstellen, dann Wrapper für sämtliche Standardfunktionen von PHP schreiben und auf Standardoperatoren verzichten zu müssen.

PHP-Code:
<?php

class Integer
{
    protected 
$value;

    
/**
     *
     * @param int $n
     */
    
public function __construct($n)
    {
        
$this->value = (int) $n;
    }

    public function 
__toString()
    {
        return 
$this->value;
    }
}

class 
String
{
    protected 
$value;

    
/**
     *
     * @param string $n
     */
    
public function __construct($s)
    {
        
$this->value = (string) $s;
    }

    public function 
__toString()
    {
        return 
$this->value;
    }
}

$s = new String('Hallo Welt');
$n = new Integer(6);
$m = new Integer(9);

var_dump(substr($s$n));
    
// Warning: substr() expects parameter 2 to be long, object given

var_dump($n $m);
    
// int(2)

echo $n;
    
// Catchable fatal error: Method Integer::__toString() must return a string
    // value
Die Alternative wäre höchstens, Methoden wie Integer::toInt() zu implementieren und einzusetzen, was irgendwie albern ist.

Was den aktuellen Stand der PHP-Entwicklung anbelangt, arbeitest du mit dem Ansatz einfach völlig gegen die Sprache. Da gibt es wenig dran zu rütteln.

Zitat:
Zitat von wahsaga
Oder kurzum bzw. anders formuliert: Du möchtest eigentlich lieber in einer anderen Sprache als PHP programmieren
PHP ist nunmal nicht Java.

PHP-Code:
class Foo
{
    
/**
     *
     * @param int    $int
     * @param float  $float
     * @param string $string
     */
    
public function myMethod($int$float$string)
    {
        
$int    = (int)    $int;
        
$float  = (float)  $float;
        
$string = (string) $string;

        
/* ... */
    
}

Mehr ist an Typsicherheit für Primitive nicht drin.
Mit Zitat antworten
  #22 (permalink)  
Alt 19-04-2011, 15:20
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
class Foo {
    
/**
     *
     * @param int    $int
     * @param float  $float
     * @param string $string
     */
    
public function myMethod($int$float$string) {
        if (! 
is_int($int)) {
            throw new 
InvalidArgumentException('$int must be integer, got ' gettype($int));
        }
        if (! 
is_float($float)) {
            throw new 
InvalidArgumentException('$float must be float, got ' gettype($float));
        }
        if (! 
is_string($string)) {
            throw new 
InvalidArgumentException('$string must be string, got ' gettype($string));
        }
    }

Mit Zitat antworten
  #23 (permalink)  
Alt 19-04-2011, 15:40
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ja, okay. Das wäre konsequenter.

Die Frage ist da dann vielleicht, ob wir in der Schnittstelle der dynamischen Typisierung von PHP Rechnung tragen oder ob wir sagen: „Ne, is' nicht, ich will den korrekten Datentyp.“

Ich kann's nicht beantworten.

Ein Nachteil meiner Methode ist allerdings, dass sie bei der Übergabe von Objekten einen Fehler oder Notices wirft. Das ist im Zweifel wohl eine Antwort.

Geändert von mermshaus (19-04-2011 um 15:52 Uhr)
Mit Zitat antworten
  #24 (permalink)  
Alt 19-04-2011, 18:39
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

mermshaus: Natürlich ist das ganze nicht wirklich ideal und ist nicht im Einklang mit der Variablenhandhabung in PHP. Es macht aber genau die Variablenüberprüfung in den Methoden überflüssig. Um die Standardbefehle nicht auch noch selbst implementieren zu müssen, kann man jeweils als erstes in der Methode einfach wieder eine normale Variable setzen ($x = $x->get(); ).
Mit Zitat antworten
  #25 (permalink)  
Alt 19-04-2011, 22:28
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

pQuery

PHP-Code:
<?php

error_reporting
(-1);

/**
 *
 *
 * String  -> string
 * Integer -> int
 * string  -> String
 * int     -> Integer
 * 
 * @param mixed $v
 * @return mixed
 */
function __($v)
{
    if (
is_object($v)) {
        if (
$v instanceof DataType) {
            return 
$v->___get();
        } else {
            throw new 
Exception();
        }
    } else {
        switch (
true) {
            case (
is_string($v)):
                return new 
String($v);
                break;
            case (
is_int($v)):
                return new 
Integer($v);
                break;
            default:
                throw new 
Exception();
                break;
        }
    }
}

abstract class 
DataType
{
    protected 
$value;
    public function 
___get() { return $this->value; }
    public function  
__toString() { return (string) $this->value; }
}

class 
Integer extends DataType
{
    public function 
__construct($n) { $this->value = (int) $n; }
}

class 
String extends DataType
{
    public function 
__construct($s) { $this->value = (string) $s; }
}



class 
SomeModel
{
    public function 
replaceTemplateVars(String $templateString $param1,
            
String $param2)
    {
        
$template __(str_replace(
                array(
'{param1}''{param2}'),
                array(
__($param1), __($param2)),
                
__($template)));
        
        return 
$template;
    }
}



$model = new SomeModel();

$template __('{param1} {param2}!');

$param1 __('Hello');
$param2 __('World');

$template $model->replaceTemplateVars($template$param1$param2);

echo 
$template;



$m __(5);
$n __(6);

$o __(__($m) + __($n));

echo 
$o;
Mit Zitat antworten
  #26 (permalink)  
Alt 19-04-2011, 22:37
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Einfach nur furchtbar. Ich kann mir nicht vorstellen, dass irgendjemand so arbeiten möchte.
Mit Zitat antworten
  #27 (permalink)  
Alt 21-04-2011, 09:39
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
pQuery

PHP-Code:
<?php

function __($v)
{
    
// ...
}

//...


$param1 __('Hello');
$param2 __('World');

// ...
$m __(5);
$n __(6);

$o __(__($m) + __($n));

// ...
Zitat:
Underscore, a Friend Indeed
Use _ and __ as identifiers.
Aus How To Write Unmaintainable Code


Zitat:
PHP-Code:
// ...
        
switch (true) {
            case (
is_string($v)):
                return new 
String($v);
                break; 
Was issn das? Eine doppelte Fall-Through-Sicherung?
Doppelt hält besser, oder wie?

Zitat:
PHP-Code:
            default:
                throw new 
Exception();
                break;
        } 
Und nochmal in einer anderen Variante?
Falls die Exception wider Erwarten nicht geworfen wird, brechen wir den default-Zweig ab, nach dem nichts mehr kommt?

Zitat:
Zitat von sili Beitrag anzeigen
mermshaus: ... Es macht aber genau die Variablenüberprüfung in den Methoden überflüssig.
Mhmmm, eine "robuste" Funktion prüft die ihr übergebenen Argumente selten nur auf den Typ. Meist werden auch noch irgendwelche Schranken abgefragt. Da dann bspw. ein
PHP-Code:
is_int($arg) || 
davor zu setzen, erscheint mir der einfachere Weg. Gut, manchmal übersieht man das und kein Compiler warnt einen dann. Aber wer das befürchtet, benötigt eben eine statisch typisierte Sprache.

Geändert von fireweasel (21-04-2011 um 10:10 Uhr)
Mit Zitat antworten
  #28 (permalink)  
Alt 21-04-2011, 10:49
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

OffTopic:
Zitat:
Zitat von fireweasel Beitrag anzeigen
Was issn das? Eine doppelte Fall-Through-Sicherung?
Doppelt hält besser, oder wie?
Aber immer doch.

Auf php.de wurden wir letzte Tage mit sowas erheitert,
Code:
SELECT id AS id, [...]

__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #29 (permalink)  
Alt 21-04-2011, 13:31
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Zitat:
Zitat von fireweasel
Was issn das? Eine doppelte Fall-Through-Sicherung?
Doppelt hält besser, oder wie?
Das Hässliche an dem Code sind imo eher die verteilten return-Statements und das redundante Werfen der Exception. Dennoch danke für den Hinweis.

Zitat:
Aus How To Write Unmaintainable Code
File einen Bug gegen gettext.

<spoiler>Es sollte zwar nach dem Lesen des Threads klar sein, aber: Der pQuery-Post war ein Witz.</spoiler>

Geändert von mermshaus (21-04-2011 um 13:36 Uhr)
Mit Zitat antworten
  #30 (permalink)  
Alt 21-04-2011, 13:38
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
File einen Bug gegen gettext.
Den würd ich sogar voten
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Interzeptor- und magische Methoden Kropff PHP Developer Forum 13 08-11-2009 19:51
magische zauberkugel ? Abraxax Out of Order 17 29-09-2006 02:48
zuweisung.. uschi PHP Developer Forum 5 12-02-2006 00:56
Magische Quadrate Maverick PHP Developer Forum 8 10-10-2002 20:32
implizierte zuweisung Elthin PHP Developer Forum 1 21-06-2001 11:42

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 09:22 Uhr.