Jump to content

Recommended Posts

Hi there (I don't know if this is the relevant part to put this thread up so I do apologise in advance).

 

But I was just wondering, when you make a private or protected function right, it cant be called outside of the class can it?

 

So what would you ideally use it for, then how would you call it, from another function, that passes that variable back possibly?

 

Just a general question really to understand the indepth stuff about I suppose it would be related to encapsulation yes?

 

Just a random question really (not going to be using them now but just curious).

 

Thanks and I appreciate any replies in advance,

Jez.

Private makes the data member or method accessible only to an instance of the class in which it was defined.  Protected makes the data member or method accessible only to an instance of the class in which it was defined AND any child classes/objects.  Neither can be invoked from the outside, so something like $obj->invokePrivateMethod(); will fail.  So, in essence, yes, things marked as private or protected are for internal (to the class/object) use only.

 

As far as uses go, well, data members should be as restricted as possible in most cases.  You don't want to give the outside world direct write access to your data fields, which is what you have with public members (note that both var and no access modifier at all default to public).  This is why most well-written code examples show fields marked as either private or protected.

 

For methods, chances are you'll have classes that have functionality you don't want other objects to get their hands on, like routine db visits.  Private and protected keep these parts hidden since the rest of the system really doesn't need to know how things are done in a particular object.

 

You were on the right track with thinking it's about encapsulation.  Objects should be seen as black boxes.  Their outside has a public interface (public methods, not necessarily the interface language construct) which tells the world how to use it properly.  The actual mechanisms that do the work are hidden to protect them.  It's not like you need to know how things work inside the box to get it to fit in with others.

Going a little off topic here, but you did say you wanted in depth.  In addition to Nightslyr's explanation, PHP has some language specific conventions about how visibility works. 

 

DISCLAIMER - These are just things that PHP does, I certainly am not condoning them as a good programming practice to do any of the following.

 

 

Protected members are also accessible to the parent class as well.  So a parent method can reference a protected member that won't be defined until the child class.

 

class A {
    public function test()
    {
        $this->echoOne();
    }
}

class B extends A {
    
    protected function echoOne()
    {
        echo '1';
    }
    
}

//echoes 1

 

Child methods can directly access protected members of an instantiated class. 

 

Continuing from above

class C extends B {
    
    public function actOnFoo()
    {
        global $Foo;
        $Foo->echoOne();
    }
}

$Bar = new C();
$Bar->actOnFoo();

//echoes 1

 

And then there's the fun one, that another instance of the same class can directly access private members of an instantiated class.  This one actually can be useful if you ever need to get information about a object's private properties when you don't have access to the code, and conversely means that you shouldn't architect anything depending on visibility keywords for security.

 

class D {
    
    private $n;
    
    public function __construct()
    {
        $this->n = 3;
    }
    
    
    public function actOnD1($newN)
    {
        global $D1;
        $D1->n = $newN;
    }
    
    public function echoN()
    {
        echo $this->n;
    }
}

$D1 = new D();
$D2 = new D(); 

$D2->actOnD1(5);
$D1->echoN();

//echoes 5

No I know how private properties work, known that since I have been going through a particular book I have been reading.

 

It is either protected (which can be used when extending a class yes?) or private (when they cannot be called then), but then you use either protected or private functions/methods to do things you don't want the user to access at all.

 

Like the checking on the system say for an ISBN no from say a library or something like that, where you use say a constructor method to create a book object and then say the constructor method then calls the checkISBN method to check but then you cannot from the object call that method directly.

 

In essence Encapsulation!

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.