PHP-Entwicklung

PHP-Entwicklung

Posts 11-19 of 19
  • Harald Lapp
    Harald Lapp    Premium Member
    The company name is only visible to registered members.
    Re^3: __get() hebelt private aus
    hallo,

    die magic methods (für overloading) müssen "public" sein, so steht's in der doku:

    "All overloading methods must be defined as public."
    http://docs.php.net/manual/en/language.oop5.overloading.php

    afaik wurde bei php < 5.3 die sichtbarkeitsdeklaration einfach ignoriert, seit 5.3 gibt's offenbar ein warning, wenn man __get / __set / __call versucht protected / private zu deklarieren.

    meiner meinung nach macht es aber auch keinen sinn die sichtbarkeit einzuschränken.

    viele grüsse,
    harald
  • Post visible to registered members
  • Kim Oliver Schneider
    Kim Oliver Schneider    Premium Member
    The company name is only visible to registered members.
    Re: __get() hebelt private aus
    dies stellt in meinen Augen ein inkonsitentes Verhalten von php dar, oder irre ich mich?
    Dafür ist doch u.A. __get() und getter im Allgemeinen gedacht.
    Wobei ich persönlich anmerken möchte, dass ich von dem Konzept mit den Interzeptormethoden nicht so begeistert bin, da kann man auch geradliniger und transparenter programmieren.

    Im Übrigen ist das, was Herr Oheim im letzten Absatz schreibt, vollkommen richtig. Wenn Sie Interzeptormethoden benutzen möchten, dann hauchen Sie denen auch das passende Leben ein.

    Ich halte es übrigens lieber altmodisch mit klassischen Gettern und Settern. Bei C# sind die Properties eine tolle Sache.
    This post was modified on 13 Aug 2009 at 01:31 pm.
  • Martin Schäpker
    Martin Schäpker    Premium Member
    The company name is only visible to registered members.
    Re^2: __get() hebelt private aus
    Wenn Sie Interzeptormethoden benutzen möchten, dann hauchen Sie denen auch das passende Leben ein.
    meine Frage bezog sich auf ein Verhalten das ich so nicht erwartet hätte, aber man lernt ja nicht aus. Real würde ich so __get nie benutzen.
  • Post visible to registered members
  • Jens Weller
    Jens Weller    Premium Member   Group moderator
    The company name is only visible to registered members.
    Re^3: __get() hebelt private aus
    Ich bezog mich auf die gepostete Implementation.

    Auch frage ich mich, wie bei einem Objekt als Member nun die Sache ist.
    foo->__get("bar")->changeValue(-1);

    Auch das OOP nur mit Getter/Setter funktioniert, ist ein Irrglaube:
    http://typicalprogrammer.com/?p=23
  • Post visible to registered members
  • Andre Baumeier
    Andre Baumeier    Premium Member
    The company name is only visible to registered members.
    Re^5: __get() hebelt private aus
    wenn wirklich vermieden werden soll das private und protected via getter-/setter ausgehebelt werden können müsste man sich an eine konvetion à la

    class myClass {
    private $_myPrivateVar;
    protected $_myProtectedVar;
    public $myPublicVar;
    }

    halten, dann könnte man in den jeweiligen magischen funktionen überprüfen ob das erste Zeichen ein Unterstrich ist, und anhand dessen eine Exception schmeißen, false / null zurückgeben oder sonstiges.

    habe keine native Möglichkeit gefunden um die sichtbarkeit eines attributes auszumachen - sofern es so etwas gibt wäre dies der konvention vorzuziehen.
  • Felix Jacobi
    Felix Jacobi    Premium Member
    The company name is only visible to registered members.
    Re^6: __get() hebelt private aus
    Es geht auch einfacher.

    <?php
    class A
    {

    protected $str = 'test';

    public function __get($var)
    {
    $prop = new ReflectionProperty(__CLASS__, $var);

    if($prop->isPrivate() || $prop->isProtected())
    {
    throw new Exception('var is private');
    }
    return $var;
    }

    }

    $a = new A;

    echo $a->str;
    ?>