How to access private members of a class in php

I have derived a class from Exception, basically like so:

class MyException extends Exception {

    private $_type;

    public function type[] {
        return $this->_type; //line 74
    }

    public function __toString[] {

        include "sometemplate.php";
        return "";

    }

}

Then, I derived from MyException like so:

class SpecialException extends MyException {

    private $_type = "superspecial";

}

If I throw new SpecialException["bla"] from a function, catch it, and go echo $e, then the __toString function should load a template, display that, and then not actually return anything to echo.

This is basically what's in the template file



Method Visibility

Class methods may be defined as public, private, or protected. Methods declared without any explicit visibility keyword are defined as public.

Example #2 Method Declaration

Constant Visibility

As of PHP 7.1.0, class constants may be defined as public, private, or protected. Constants declared without any explicit visibility keyword are defined as public.

Example #3 Constant Declaration as of PHP 7.1.0

Visibility from other objects

Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.

Example #4 Accessing private members of the same object type

The above example will output:

string[5] "hello"
Accessed the private method.

wbcarts at juno dot com

10 years ago

INSIDE CODE and OUTSIDE CODE



Ok, that's simple enough... I got it inside and out. The big problem with this is that the Item class is COMPLETELY IGNORANT in the following ways:
* It REQUIRES OUTSIDE CODE to do all the work AND to know what and how to do it -- huge mistake.
* OUTSIDE CODE can cast Item properties to any other PHP types [booleans, integers, floats, strings, arrays, and objects etc.] -- another huge mistake.

Note: we did it correctly above, but what if someone made an array for $price? FYI: PHP has no clue what we mean by an Item, especially by the terms of our class definition above. To PHP, our Item is something with two properties [mutable in every way] and that's it. As far as PHP is concerned, we can pack the entire set of Britannica Encyclopedias into the price slot. When that happens, we no longer have what we expect an Item to be.

INSIDE CODE should keep the integrity of the object. For example, our class definition should keep $label a string and $price a float -- which means only strings can come IN and OUT of the class for label, and only floats can come IN and OUT of the class for price.


Output will be "child".

pgl at yoyo dot org

7 years ago

Just a quick note that it's possible to declare visibility for multiple properties at the same time, by separating them by commas.

eg:

stephane at harobed dot org

16 years ago

A class A static public function can access to class A private function :



It's working.

alexaulbach at mayflower dot de

9 years ago



?>

Result is
A: 1 , 2
B: 2 , 2
A: 1 , 3
B: 3 , 3

This is correct code and does not warn you to use any private.

"$this->private" is only in A private. If you write it in class B it's a runtime declaration of the public variable "$this->private", and PHP doesn't even warn you that you create a variable in a class without declaration, because this is normal behavior.

r dot wilczek at web-appz dot de

16 years ago

Beware: Visibility works on a per-class-base and does not prevent instances of the same class accessing each others properties!

Marce!

13 years ago

Please note that protected methods are also available from sibling classes as long as the method is declared in the common parent. This may also be an abstract method.

In the below example Bar knows about the existence of _test[] in Foo because they inherited this method from the same parent. It does not matter that it was abstract in the parent.

imran at phptrack dot com

13 years ago

Some Method Overriding rules :

1. In the overriding, the method names and arguments [arg’s] must be same.

Example:
class p { public function getName[]{} }
class c extends P{ public function getName[]{} }

2. final methods can’t be overridden.

3. private methods never participate in the in the overriding because these methods are not visible in the child classes.

Example:
class a {
private  function my[]{   
    print "parent:my";
}
public function getmy[]{
$this->my[];
}
}
class b extends a{
    private  function my[]{
        print "base:my";       
}
}
$x = new b[];
$x->getmy[]; // parent:my

4. While overriding decreasing access specifier is not allowed

class a {
public  function my[]{   
    print "parent:my";
}

}
class b extends a{
    private  function my[]{
        print "base:my";       
}
}
//Fatal error:  Access level to b::my[] must be public [as in class a]

tushar dot khan0122 at gmail dot com

3 years ago

1 . If the class member declared as public then it can be accessed everywhere.
2 . If the class members declared as protected then it can be accessed only within the class itself and by inheriting and parent classes.
3 .If the class members declared as private then it may only be accessed by the class that defines the member.

IgelHaut

10 years ago



The code prints
test Object [ [public] => Public var [protected:protected] => protected var [private:test:private] => Private var ]

Functions like print_r[], var_dump[] and var_export[] prints public, protected and private variables, but not the static variables.

omega at 2093 dot es

10 years ago

This has already been noted here, but there was no clear example. Methods defined in a parent class can NOT access private methods defined in a class which inherits from them. They can access protected, though.

Example:

Chủ Đề