Borys Serebrov

<!doctype html><html lang=en><head><meta charset=utf-8><meta name=theme-color content=”#44ccff”><meta name=twitter:card content=”summary”>PHP - friend a class via extend • vim, git, aws and other three-letter words<link rel=canonical href=https://serebrov.github.io/html/2012-12-09-php-friend-via-extend.md><link rel=icon href=/favicon.ico><link rel=stylesheet href=/assets/css/main.6a060eb7.css><link rel=stylesheet href=/css/custom.css><script type=application/javascript>var doNotTrack=!1;doNotTrack||(window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga(“create”,”UA-58056088-1”,”auto”),ga(“send”,”pageview”))</script><script async src=https://www.google-analytics.com/analytics.js></script></head><body class='page type-note has-sidebar'><div class=site><div id=sidebar class=sidebar><a class=screen-reader-text href=#main-menu>Skip to Main Menu</a><div class=container><section class='widget widget-about sep-after'><header><div class=logo><a href=/><img src=/images/logo.jpg></a></div><h2 class='title site-title'><a href=/>vim, git, aws and other three-letter words</a></h2><div class=desc>Software Development Notes</div></header></section><section class='widget widget-search sep-after'><header><h4 class='title widget-title'>Search</h4></header><form action=/search id=search-form class=search-form></form></section><section class='widget widget-sidebar_menu sep-after'><nav id=sidebar-menu class=’menu sidebar-menu’ aria-label=’Sidebar Menu’><div class=container><ul><li class=item><a href=/>Home</a></li><li class=item><a href=/posts/>Posts</a></li><li class='item has-current'><a href=/archive/>Archive</a></li></ul></div></nav></section><section class='widget widget-taxonomy_cloud sep-after'><header><h4 class='title widget-title'>Tags</h4></header><div class='container list-container'><ul class='list taxonomy-cloud no-shuffle'><li><a href=/tags/ai/ style=font-size:1em>ai</a></li><li><a href=/tags/android/ style=font-size:1em>android</a></li><li><a href=/tags/angularjs/ style=font-size:1.1em>angularjs</a></li><li><a href=/tags/aws/ style=font-size:1.9em>aws</a></li><li><a href=/tags/bash/ style=font-size:1em>bash</a></li><li><a href=/tags/celery/ style=font-size:1em>celery</a></li><li><a href=/tags/chrome/ style=font-size:1em>chrome</a></li><li><a href=/tags/cmd/ style=font-size:1em>cmd</a></li><li><a href=/tags/cors/ style=font-size:1em>cors</a></li><li><a href=/tags/cw-logs/ style=font-size:1.05em>cw-logs</a></li><li><a href=/tags/disqus/ style=font-size:1em>disqus</a></li><li><a href=/tags/docker/ style=font-size:1.05em>docker</a></li><li><a href=/tags/drone/ style=font-size:1em>drone</a></li><li><a href=/tags/dynamodb/ style=font-size:1.1em>dynamodb</a></li><li><a href=/tags/eb/ style=font-size:1.2em>eb</a></li><li><a href=/tags/ejs/ style=font-size:1em>ejs</a></li><li><a href=/tags/emr/ style=font-size:1.05em>emr</a></li><li><a href=/tags/express.js/ style=font-size:1em>express.js</a></li><li><a href=/tags/fastapi/ style=font-size:1em>fastapi</a></li><li><a href=/tags/git/ style=font-size:2em>git</a></li><li><a href=/tags/google-colab/ style=font-size:1em>google-colab</a></li><li><a href=/tags/hive/ style=font-size:1em>hive</a></li><li><a href=/tags/jquery/ style=font-size:1.1em>jquery</a></li><li><a href=/tags/js/ style=font-size:1.1em>js</a></li><li><a href=/tags/json/ style=font-size:1em>json</a></li><li><a href=/tags/kbd/ style=font-size:1.1em>kbd</a></li><li><a href=/tags/linux/ style=font-size:1em>linux</a></li><li><a href=/tags/mongodb/ style=font-size:1em>mongodb</a></li><li><a href=/tags/mysql/ style=font-size:1.05em>mysql</a></li><li><a href=/tags/node.js/ style=font-size:1.2em>node.js</a></li><li><a href=/tags/npm/ style=font-size:1em>npm</a></li><li><a href=/tags/oauth/ style=font-size:1em>oauth</a></li><li><a href=/tags/oop/ style=font-size:1em>oop</a></li><li><a href=/tags/php/ style=font-size:1.15em>php</a></li><li><a href=/tags/postgresql/ style=font-size:1em>postgresql</a></li><li><a href=/tags/python/ style=font-size:1.1em>python</a></li><li><a href=/tags/rds/ style=font-size:1.05em>rds</a></li><li><a href=/tags/scaleway/ style=font-size:1em>scaleway</a></li><li><a href=/tags/selenium/ style=font-size:1.3em>selenium</a></li><li><a href=/tags/ssh/ style=font-size:1em>ssh</a></li><li><a href=/tags/tmux/ style=font-size:1em>tmux</a></li><li><a href=/tags/tts/ style=font-size:1em>tts</a></li><li><a href=/tags/typing/ style=font-size:1.05em>typing</a></li><li><a href=/tags/vim/ style=font-size:1.05em>vim</a></li><li><a href=/tags/vr/ style=font-size:1em>vr</a></li><li><a href=/tags/vue/ style=font-size:1.1em>vue</a></li><li><a href=/tags/web/ style=font-size:1em>web</a></li><li><a href=/tags/yii/ style=font-size:1.15em>yii</a></li><li><a href=/tags/zeromq/ style=font-size:1em>zeromq</a></li></ul></div></section></div><div class=sidebar-overlay></div></div><div class=main><nav id=main-menu class=’menu main-menu’ aria-label=’Main Menu’><div class=container><a class=screen-reader-text href=#content>Skip to Content</a> <button id=sidebar-toggler class=sidebar-toggler aria-controls=sidebar> <span class=screen-reader-text>Toggle Sidebar</span> </button><ul><li class=item><a href=/>Home</a></li><li class=item><a href=/posts/>Posts</a></li><li class='item current'><a aria-current=page href=/archive/>Archive</a></li></ul></div></nav><div class=header-widgets><div class=container></div></div><header id=header class='header site-header'><div class='container sep-after'><div class=header-info><p class='site-title title'>vim, git, aws and other three-letter words</p><p class='desc site-desc'>Software Development Notes</p></div></div></header><main id=content><article lang=en class=entry><header class='header entry-header'><div class='container sep-after'><div class=header-info><h1 class=title>PHP - friend a class via extend</h1></div><div class=entry-meta><span class=posted-on><span class=screen-reader-text>Posted on</span> <time class=entry-date datetime=2012-04-03T00:00:00Z>2012, Apr 03</time></span> <span class=reading-time>One min read</span></div></div></header><div class="container entry-content custom"><p>C++ allows to declare one class as a friend of another one.</p><p>This can be useful if you want to keep some details of class protected, but available for another particular (friend) class.</p><p>For example this can be used in <a href=http://sourcemaking.com/design_patterns/state>State pattern</a> to keep setState method of context class protected.</p><p>To emulate this in PHP we can inherit state class from context class:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-php data-lang=php><span style=display:flex> <span style=color:#66d9ef>class <span style=color:#a6e22e>AContext</span> { </span></span><span style=display:flex> <span style=color:#66d9ef>private $_state; </span></span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>protected <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>setState</span>(<span style=color:#a6e22e>AState</span> $state) { </span></span><span style=display:flex> $this<span style=color:#f92672>-><span style=color:#a6e22e>_state</span> <span style=color:#f92672>=</span> $state; </span></span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>public <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>request</span>() { </span></span><span style=display:flex> $this<span style=color:#f92672>-><span style=color:#a6e22e>_state</span><span style=color:#f92672>-></span><span style=color:#a6e22e>handle</span>(); </span></span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>abstract <span style=color:#66d9ef>class</span> <span style=color:#a6e22e>AState</span> <span style=color:#66d9ef>extends</span> <span style=color:#a6e22e>AContext</span> { </span></span><span style=display:flex> <span style=color:#66d9ef>private $_owner; </span></span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>public <span style=color:#66d9ef>function</span> __construct(<span style=color:#a6e22e>AContext</span> $owner) { </span></span><span style=display:flex> $this<span style=color:#f92672>-><span style=color:#a6e22e>_owner</span> <span style=color:#f92672>=</span> $owner; </span></span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>protected <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>getOwner</span>() { </span></span><span style=display:flex> <span style=color:#66d9ef>return $this<span style=color:#f92672>-></span><span style=color:#a6e22e>_owner</span>; </span></span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>abstract <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>handle</span>(); </span></span><span style=display:flex> </span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>class <span style=color:#a6e22e>AConcreteState</span> <span style=color:#66d9ef>extends</span> <span style=color:#a6e22e>AState</span> { </span></span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>public <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>handle</span>() { </span></span><span style=display:flex> <span style=color:#f92672>… </span></span><span style=display:flex> $this<span style=color:#f92672>-><span style=color:#a6e22e>getOwner</span>()<span style=color:#f92672>-></span><span style=color:#a6e22e>setState</span>(<span style=color:#66d9ef>new</span> <span style=color:#a6e22e>AnotherState</span>($this<span style=color:#f92672>-></span><span style=color:#a6e22e>getOwner</span>()); </span></span><span style=display:flex> } </span><span style=display:flex> } </span><span style=display:flex> </span><span style=display:flex> <span style=color:#66d9ef>class <span style=color:#a6e22e>AnotherState</span> <span style=color:#66d9ef>extends</span> <span style=color:#a6e22e>AState</span> { </span></span><span style=display:flex> <span style=color:#f92672>… </span></span><span style=display:flex> } </span></code></pre></div><a href=https://stackexchange.com/users/261528>profile for Boris Serebrov on Stack Exchange, a network of free, community-driven Q&A sites</a></div><div class=popup><div class=close>close</div><div class=download>Download ()</div><div class=popup-content></div></div><footer class=entry-footer><div class='container sep-before'><div class=tags><span class=screen-reader-text>Tags: </span><a class=tag href=/tags/php/>php</a></div></div></footer></article><nav class=entry-nav><div class=container><div class='prev-entry sep-before'><a href=/html/2012-10-09-phpmyadmin-and-eaccelerator-problem.html> <span class=screen-reader-text>Previous post: </span>phpmyadmin and eaccelerator problem</a></div><div class='next-entry sep-before'><a href=/html/2012-10-10-gimport.html><span class=screen-reader-text>Next post: </span>GImport yii extension</a></div></div></nav><section id=comments class=comments><div class='container sep-before'><div class=comments-area><div id=disqus_thread></div></div></div></section></main><footer id=footer class=footer><div class='container sep-before'><section class='widget widget-social_menu sep-after'><nav aria-label='Social Menu'><ul><li><a href=https://github.com/serebrov target=_blank rel=noopener><span class=screen-reader-text>Open Github account in new tab</span></a></li><li><a href=mailto:serebrov@gmail.com target=_blank rel=noopener><span class=screen-reader-text>Contact via Email</span></a></li></ul></nav></section><div class=copyright><p>© 2020-2024 Boris Serebrov</p></div></div></footer></div></div><script src=https://serebrov.github.io/assets/js/main.67d669ac.js></script><script src=/js/jquery.min.js></script><script src=/js/custom.js></script></body></html>