https://doc.nette.org/en/php-generator

Submitted URL:
https://doc.nette.org/php-generatorRedirected
Report Finished:

The outgoing links identified from the page

LinkText
https://nette.org/en/donateDonate
https://nette.org/ennette
https://blog.nette.orgBlog
https://forum.nette.org/en/Forum
https://latte.nette.org/Lattethe safest& intuitive templates
https://tester.nette.org/Testerenjoyable unit testing in PHP
https://tracy.nette.org/Tracydebugging tool you will love ♥
https://nette.org/en/packages…list of all packages
https://discord.gg/azXxTbuQVqDiscord Nette
https://nette.org/en/releasesRelease Notes

JavaScript Variables · 41 found

Global JavaScript variables loaded on the window object of a page, are variables declared outside of functions and accessible from anywhere in the code within the current scope

NameType
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject
cyrb53function
validityIntervalnumber
clientIdHashstring
gtagfunction
dataLayerobject
google_tag_managerobject
google_tag_dataobject

Console log messages · 1 found

Messages logged to the web console

TypeCategoryLog
errornetwork
URL
https://files.nette.l/images/search.svg
Text
Failed to load resource: net::ERR_CONNECTION_CLOSED

HTML

The raw HTML body of the page

<!DOCTYPE html><html lang="en" class="site--nette site--wide" style="--viewport-width: 785px; scroll-behavior: smooth;"><head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">

	<title>PHP Code Generator – Nette Documentation</title>

	<meta name="author" content="David Grudl; https://davidgrudl.com">
	<meta property="og:title" content="PHP Code Generator">
 
	<meta property="og:image" content="https://files.nette.org/ogimage/nette?text=PHP+Code+Generator">
	<meta property="og:image:width" content="1200">
	<meta property="og:image:height" content="630">
	<meta property="og:url" content="https://doc.nette.org/en/php-generator">
	<meta property="og:site_name" content="Nette Documentation">
	<meta name="twitter:card" content="summary_large_image">
	<meta name="twitter:site" content="@nettefw">
	<meta name="twitter:image" content="https://files.nette.org/ogimage/nette?text=PHP+Code+Generator">
	<meta name="twitter:title" content="PHP Code Generator">

	<link rel="canonical" href="https://doc.nette.org/en/php-generator">
	<link rel="apple-touch-icon" sizes="228x228" href="https://files.nette.org/icons/nette/favicon.png?v=1580809614">
	<link rel="icon" type="image/png" href="https://files.nette.org/icons/nette/favicon.png?v=1580809614" sizes="228x228">
	<link rel="manifest" href="https://files.nette.org/icons/nette/site.webmanifest?v=1580809614">
	<link rel="mask-icon" href="https://files.nette.org/icons/nette/safari-pinned-tab.svg?v=1580809614" color="#5bbad5">
	<link rel="alternate" hreflang="en" href="https://doc.nette.org/en/php-generator">
	<link rel="alternate" hreflang="cs" href="https://doc.nette.org/cs/php-generator">
	<link rel="alternate" hreflang="de" href="https://doc.nette.org/de/php-generator">
	<link rel="alternate" hreflang="es" href="https://doc.nette.org/es/php-generator">
	<link rel="alternate" hreflang="fr" href="https://doc.nette.org/fr/php-generator">
	<link rel="alternate" hreflang="it" href="https://doc.nette.org/it/php-generator">
	<link rel="alternate" hreflang="hu" href="https://doc.nette.org/hu/php-generator">
	<link rel="alternate" hreflang="pl" href="https://doc.nette.org/pl/php-generator">
	<link rel="alternate" hreflang="pt" href="https://doc.nette.org/pt/php-generator">
	<link rel="alternate" hreflang="ro" href="https://doc.nette.org/ro/php-generator">
	<link rel="alternate" hreflang="sl" href="https://doc.nette.org/sl/php-generator">
	<link rel="alternate" hreflang="tr" href="https://doc.nette.org/tr/php-generator">
	<link rel="alternate" hreflang="el" href="https://doc.nette.org/el/php-generator">
	<link rel="alternate" hreflang="bg" href="https://doc.nette.org/bg/php-generator">
	<link rel="alternate" hreflang="ru" href="https://doc.nette.org/ru/php-generator">
	<link rel="alternate" hreflang="uk" href="https://doc.nette.org/uk/php-generator">
	<link rel="alternate" hreflang="ja" href="https://doc.nette.org/ja/php-generator">
	<link rel="search" type="application/opensearchdescription+xml" href="https://nette.org/opensearch.xml" title="Nette Framework">
	<link rel="search" type="application/opensearchdescription+xml" href="https://forum.nette.org/opensearch.xml" title="Nette Framework forum">
	<meta name="docsearch:rank" content="30">
	<link rel="prev" href="/en/schema">

	<script src="https://www.googletagmanager.com/gtag/js?id=G-351ZWVTLMC" async=""></script>
	<script>
		var cyrb53 = function(f,c){ c=void 0===c?0:c;for(var a=3735928559^c,b=1103547991^c,d=0,e;d<f.length;d++)e=f.charCodeAt(d),a=Math.imul(a^e,2654435761),b=Math.imul(b^e,1597334677);a=Math.imul(a^a>>>16,2246822507)^Math.imul(b^b>>>13,3266489909);b=Math.imul(b^b>>>16,2246822507)^Math.imul(a^a>>>13,3266489909);return 4294967296*(2097151&b)+(a>>>0)};
		var validityInterval = Math.round(new Date() / 1000 / 3600 / 24 / 7);
		var clientIdHash = cyrb53(["104.28.155.131", validityInterval, window.location.host, navigator.userAgent, navigator.language, screen.height, screen.width, screen.colorDepth, new Date().getTimezoneOffset()].join(';')).toString(16);

		window.dataLayer = window.dataLayer || [];
		function gtag(){ dataLayer.push(arguments);}
		gtag('js', new Date());
		gtag('config', 'G-351ZWVTLMC', { client_storage: 'none', anonymize_ip: true, client_id: clientIdHash })
	</script>

	<link rel="stylesheet" href="https://files.nette.org/combined.css?v=1722962570">
	<script>
		(new ResizeObserver(() => { document.documentElement.style.setProperty('--viewport-width', document.documentElement.clientWidth + 'px'); })).observe(document.documentElement);
	</script>
</head>


<body>
<script src="https://files.nette.org/combined.js?v=1718706078" async=""></script>

<div class="nettebar-placeholder nettebar--sticky"><nav class="nettebar">
	<div class="nettebar-line">
		<div class="nettebar-donate"><a href="https://nette.org/en/donate">Donate</a></div>
		<div class="nettebar-container">
			<div class="nettebar-inner">
				<ul>
					<li class="nettebar-logo"><a href="https://nette.org/en"><span>nette</span></a></li>
					<li class="nettebar-label"><a href="#">Projects</a></li>
					<li><a href="https://doc.nette.org">Documentation</a></li>
					<li><a href="https://blog.nette.org">Blog<span class="nettebar-badge"></span></a></li>
					<li><a href="https://forum.nette.org/en/">Forum</a></li>
					<li class="nettebar-right"></li>
					<li class="nettebar-language">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"></path><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z" fill="currentColor"></path></svg>
						<span>Languages</span>
					</li>
				</ul>
				<div class="nettebar-languages-popup">
					<ul>
						<li><a href="https://doc.nette.org/en/php-generator" hreflang="en" class="nettebar-lang nettebar-lang-active">English</a></li>
						<li><a href="https://doc.nette.org/cs/php-generator" hreflang="cs" class="nettebar-lang">Česky</a></li>
						<li><a href="https://doc.nette.org/de/php-generator" hreflang="de" class="nettebar-lang">Deutsch</a></li>
						<li><a href="https://doc.nette.org/es/php-generator" hreflang="es" class="nettebar-lang">Español</a></li>
						<li><a href="https://doc.nette.org/fr/php-generator" hreflang="fr" class="nettebar-lang">Français</a></li>
						<li><a href="https://doc.nette.org/it/php-generator" hreflang="it" class="nettebar-lang">Italiano</a></li>
						<li><a href="https://doc.nette.org/hu/php-generator" hreflang="hu" class="nettebar-lang">Magyar</a></li>
						<li><a href="https://doc.nette.org/pl/php-generator" hreflang="pl" class="nettebar-lang">Polska</a></li>
						<li><a href="https://doc.nette.org/pt/php-generator" hreflang="pt" class="nettebar-lang">Português</a></li>
						<li><a href="https://doc.nette.org/ro/php-generator" hreflang="ro" class="nettebar-lang">Română</a></li>
						<li><a href="https://doc.nette.org/sl/php-generator" hreflang="sl" class="nettebar-lang">Slovenski</a></li>
						<li><a href="https://doc.nette.org/tr/php-generator" hreflang="tr" class="nettebar-lang">Türkçe</a></li>
						<li><a href="https://doc.nette.org/el/php-generator" hreflang="el" class="nettebar-lang">Ελληνικά</a></li>
						<li><a href="https://doc.nette.org/bg/php-generator" hreflang="bg" class="nettebar-lang">Български</a></li>
						<li><a href="https://doc.nette.org/ru/php-generator" hreflang="ru" class="nettebar-lang">Русский</a></li>
						<li><a href="https://doc.nette.org/uk/php-generator" hreflang="uk" class="nettebar-lang">Українська</a></li>
						<li><a href="https://doc.nette.org/ja/php-generator" hreflang="ja" class="nettebar-lang">日本語</a></li>
					</ul>
				</div>
				<form action="https://www.google.com/cse" class="nettebar-search">
					<input type="hidden" name="cx" value="011549293477758430224:vxofa9ufnhc"><input type="hidden" name="ie" value="UTF-8"><span class="algolia-autocomplete" style="position: relative; display: inline-block; direction: ltr;"><input type="search" name="q" size="30" placeholder="Search" autocomplete="off" class="ds-input" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-label="search input" aria-owns="algolia-autocomplete-listbox-0" dir="auto" style="position: relative; vertical-align: top;"><pre aria-hidden="true" style="position: absolute; visibility: hidden; white-space: pre; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 500; word-spacing: 0px; letter-spacing: normal; text-indent: 0px; text-rendering: auto; text-transform: none;"></pre><span class="ds-dropdown-menu" role="listbox" id="algolia-autocomplete-listbox-0" style="position: absolute; top: 100%; z-index: 100; display: none; left: 0px; right: auto;"><div class="ds-dataset-1"></div></span></span><button type="submit" alt="Search"></button>
				</form>
				<div class="nettebar-scroll">►</div>
			</div>
		</div>
	</div>

	<div class="nettebar-flyout" style="height: 0px;">
		<div class="nettebar-container">
			<div class="nettebar-columns">
				<div class="nettebar-column-auto nettebar-projects">
					<h6>Open Source Projects</h6>
					<ul>
						<li class="nettebar-list-lead"><a href="https://doc.nette.org/en/application">Web Framework <span>component-based MVC</span></a></li>
						<li class="nettebar-list-lead"><a href="https://latte.nette.org/">Latte <span>the safest &amp; intuitive templates</span></a></li>
						<li class="nettebar-list-lead"><a href="https://tester.nette.org/">Tester <span>enjoyable unit testing in PHP</span></a></li>
						<li class="nettebar-list-lead"><a href="https://tracy.nette.org/">Tracy <span>debugging tool you will love ♥</span></a></li>
						<li class="nettebar-list-lead nettebar-list-spacer"><a href="https://doc.nette.org/en/dependency-injection">Dependency Injection <span>challenging container</span></a></li>
						<li><a href="https://doc.nette.org/en/caching">Caching</a></li>
						<li><a href="https://doc.nette.org/en/database">Database <span>layer for PHP</span></a></li>
						<li><a href="https://doc.nette.org/en/forms">Forms <span>greatly facilitates web forms</span></a></li>
						<li><a href="https://doc.nette.org/en/mail">Mail <span>sending emails</span></a></li>
						<li><a href="https://doc.nette.org/en/neon">Neon <span>readable file format</span></a></li>
						<li><a href="https://doc.nette.org/en/php-generator">PHP Code Generator</a></li>
						<li><a href="https://doc.nette.org/en/schema">Schema <span>user data validation</span></a></li>
						<li><a href="https://doc.nette.org/en/utils">Utils <span>collection of useful utilities</span></a></li>
						<li><a href="https://nette.org/en/packages">…list of all packages</a></li>
					</ul>
				</div>

				<div class="nettebar-column-auto">
					<h6>Help &amp; Support</h6>
					<ul>
						<li><a href="https://forum.nette.org/en/">Forum</a></li>
						<li><a href="https://discord.gg/azXxTbuQVq">Discord Nette</a></li>
						<li><a href="https://nette.org/en/releases">Release Notes</a></li>
					</ul>

					<h6>Learn</h6>
					<ul>
						<li><a href="https://doc.nette.org">Documentation</a></li>
						<li><a href="https://blog.nette.org">Blog</a></li>
						<li><a href="https://api.nette.org">API</a></li>
						<li><a href="https://nette.org/about">About Nette</a></li>
					</ul>
				</div>

				<div class="nettebar-column-auto">
					<h6>Community</h6>
					<ul>
						<li><a href="https://nette.org/en/donate#platinum-partner">Partners and sponsors</a></li>
						<li><a href="https://github.com/nette">GitHub</a></li>
						<li><a href="https://componette.org">Componette</a></li>
						<li><a href="https://nette.org/contributors">Hall of Fame</a></li>
						<li><a href="https://builtwith.nette.org/">Showcase</a></li>
						<li><a href="https://nette.org/donate">Donate Now</a></li>
					</ul>
				</div>

				<div class="nettebar-column-auto nettebar-about">
					<p>With Nette Framework, you'll write less, your code will be cleaner, and your work will be more enjoyable. The Nette Framework comes with a host of technical innovations - you'll build perfectly secure applications that are easy to extend.</p>

					<h6>Follow us</h6>

					<div class="nettebar-social">
						<a href="https://blog.nette.org" title="Nette Blog"><img src="https://files.nette.org/images/icon-blog.png?v=1612307863" alt="Nette Blog"></a>
						<a href="https://twitter.com/nettefw" title="Twitter"><img src="https://files.nette.org/images/icon-twitter.png?v=1612307863" alt="Twitter"></a>
					</div>
				</div>
			</div>
		</div>
	</div>
</nav>
</div>
<script src="https://nette.org/endpoint?nettebar=3&amp;lang=en&amp;active=&amp;langs=en,cs,de,es,fr,it,hu,pl,pt,ro,sl,tr,el,bg,ru,uk,ja" async=""></script>



	<section class="main main--php-generator main--leftbar main--sidebar">
		<div class="container">
		<div class="container-margin">
			<div class="main-columns">
	<h1 class="main-header">PHP Code Generator</h1>

				<div class="content">





	<main class="wiki">
	

<div class="perex">Are you looking for a tool to generate PHP code for classes, functions, or complete&nbsp;files?
	<ul>
		<li>Supports all the latest PHP features (like enums, etc.)</li>

		<li>Allows you to easily modify existing classes</li>

		<li>Output compliant with PSR-12 / PER coding style</li>

		<li>Mature, stable, and widely used library</li>
	</ul>
</div>

<h2 id="toc-installation">Installation<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-installation"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Download and install the library using the <a href="https://doc.nette.org/en/best-practices/composer">Composer</a>&nbsp;tool:</p>

<div class="code-toolbar"><pre class="language-shell" tabindex="0"><code class="language-shell"><span class="prism-token prism-function">composer</span> require nette/php-generator
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div></div></div>

<p>For PHP compatibility, see the <a href="#toc-compatibility-table">table</a>.</p>

<h2 id="toc-classes">Classes<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-classes"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Let's&nbsp;start with an example of creating a class using <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/ClassType.html">ClassType</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setFinal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setExtends</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">ParentClass<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addImplement</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">Countable<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-double-quoted-string">"Class description.\nSecond line\n"</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'@property-read Nette\Forms\Form $form'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// generate code simply by typecasting to string or using echo:</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>This will return:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-comment">/**
 * Class description
 * Second line
 *
 * @property-read Nette\Forms\Form $form
 */</span>
<span class="prism-token prism-keyword">final</span> <span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span> <span class="prism-token prism-keyword">extends</span> <span class="prism-token prism-class-name">ParentClass</span> <span class="prism-token prism-keyword">implements</span> <span class="prism-token prism-class-name">Countable</span>
<span class="prism-token prism-punctuation">{</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>To generate the code, you can also use a so-called printer, which, unlike <code>echo $class</code>, can be <a href="#toc-printer-and-psr-compliance">further configured</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$printer</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Printer</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$printer</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">printClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can add constants (class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Constant.html">Constant</a>) and properties (class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Property.html">Property</a>):</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addConstant</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'ID'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">123</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setProtected</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// constant visibility</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'int'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setFinal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addProperty</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'items'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setPrivate</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// or setVisibility('private')</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setStatic</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'@var int[]'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addProperty</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'list'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'?array'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setInitialized</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// outputs '= null'</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>This will generate:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">final</span> <span class="prism-token prism-keyword">protected</span> <span class="prism-token prism-keyword">const</span> <span class="prism-token prism-keyword prism-type-declaration">int</span> <span class="prism-token prism-constant">ID</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">123</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">/** @var int[] */</span>
<span class="prism-token prism-keyword">private</span> <span class="prism-token prism-keyword">static</span> <span class="prism-token prism-variable">$items</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-operator">?</span><span class="prism-token prism-keyword prism-type-hint">array</span> <span class="prism-token prism-variable">$list</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-constant">null</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>And you can add <a href="#toc-method-and-function-signatures">methods</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'count'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Count it.'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setFinal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setProtected</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setReturnType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'?int'</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// return types for methods</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return count($items ?: $this-&gt;items);'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'items'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// $items = []</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setReference</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>           <span class="prism-token prism-comment">// &amp;$items = []</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'array'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>        <span class="prism-token prism-comment">// array &amp;$items = []</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-comment">/**
 * Count it.
 */</span>
<span class="prism-token prism-keyword">final</span> <span class="prism-token prism-keyword">protected</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">count</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-keyword prism-type-declaration">array</span> <span class="prism-token prism-operator">&amp;</span><span class="prism-token prism-variable">$items</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-operator">?</span><span class="prism-token prism-keyword prism-return-type">int</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-function">count</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$items</span> <span class="prism-token prism-operator">?</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-this prism-keyword">$this</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-property">items</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Promoted parameters introduced in PHP 8.0&nbsp;can be passed to the constructor:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'__construct'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addPromotedParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'name'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addPromotedParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'args'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setPrivate</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">__construct</span><span class="prism-token prism-punctuation">(</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-variable">$name</span><span class="prism-token prism-punctuation">,</span>
	<span class="prism-token prism-keyword">private</span> <span class="prism-token prism-variable">$args</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">,</span>
<span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-punctuation">{</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Readonly properties and classes be marked using the <code>setReadOnly()</code> function.</p>

<hr>

<p>If an added property, constant, method, or parameter already exists, an exception is thrown.</p>

<p>Class members can be removed using <code>removeProperty()</code>, <code>removeConstant()</code>, <code>removeMethod()</code>,
or <code>removeParameter()</code>.</p>

<p>You can also add existing <code>Method</code>, <code>Property</code>, or <code>Constant</code> objects to the&nbsp;class:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Method</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'getHandle'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$property</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Property</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'handle'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$const</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Constant</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'ROLE'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMember</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$method</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMember</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$property</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMember</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$const</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can also clone existing methods, properties, and constants under a different name using <code>cloneWithName()</code>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$methodCount</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">getMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'count'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$methodRecount</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$methodCount</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">cloneWithName</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'recount'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMember</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$methodRecount</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-interfaces-or-traits">Interfaces or Traits<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-interfaces-or-traits"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>You can create interfaces and traits (classes <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/InterfaceType.html">InterfaceType</a> and <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/TraitType.html">TraitType</a>):</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$interface</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>InterfaceType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'MyInterface'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$trait</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>TraitType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'MyTrait'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Using a trait:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addTrait</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'SmartObject'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addTrait</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'MyTrait'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addResolution</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'sayHello as protected'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'@use MyTrait&lt;Foo&gt;'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">SmartObject</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">/** @use MyTrait&lt;Foo&gt; */</span>
	<span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">MyTrait</span> <span class="prism-token prism-punctuation">{</span>
		sayHello <span class="prism-token prism-keyword">as</span> <span class="prism-token prism-keyword">protected</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-punctuation">}</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-enums">Enums<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-enums"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>You can easily create enums introduced in PHP 8.1&nbsp;like this (class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/EnumType.html">EnumType</a>):</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$enum</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>EnumType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Suit'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Clubs'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Diamonds'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Hearts'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Spades'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$enum</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">enum</span> <span class="prism-token prism-class-name-definition prism-class-name">Suit</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">case</span> <span class="prism-token prism-constant">Clubs</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-keyword">case</span> <span class="prism-token prism-constant">Diamonds</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-keyword">case</span> <span class="prism-token prism-constant">Hearts</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-keyword">case</span> <span class="prism-token prism-constant">Spades</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can also define scalar equivalents and create a “backed”&nbsp;enum:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Clubs'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'♣'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$enum</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addCase</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Diamonds'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'♦'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>For each <i>case</i>, you can add a comment or <a href="#toc-attributes">attributes</a> using <code>addComment()</code> or
<code>addAttribute()</code>.</p>

<h2 id="toc-anonymous-classes">Anonymous Classes<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-anonymous-classes"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Pass <code>null</code> as the name, and you have an anonymous&nbsp;class:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-constant">null</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'__construct'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-string prism-single-quoted-string">'$obj = new class ($val) '</span> <span class="prism-token prism-operator">.</span> <span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">.</span> <span class="prism-token prism-string prism-single-quoted-string">';'</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$obj</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-keyword">class</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$val</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-punctuation">{</span>

	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">__construct</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$foo</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-punctuation">}</span>
<span class="prism-token prism-punctuation">}</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-global-functions">Global Functions<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-global-functions"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The code for functions is generated by the class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/GlobalFunction.html">GlobalFunction</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return $a + $b;'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'a'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'b'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$function</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or use the PsrPrinter for output compliant with PSR-2 / PSR-12 / PER</span>
<span class="prism-token prism-comment">// echo (new Nette\PhpGenerator\PsrPrinter)-&gt;printFunction($function);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-variable">$a</span> <span class="prism-token prism-operator">+</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-anonymous-functions">Anonymous Functions<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-anonymous-functions"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The code for anonymous functions is generated by the class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Closure.html">Closure</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$closure</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Closure</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return $a + $b;'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'a'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'b'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addUse</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'c'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setReference</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$closure</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or use the PsrPrinter for output compliant with PSR-2 / PSR-12 / PER</span>
<span class="prism-token prism-comment">// echo (new Nette\PhpGenerator\PsrPrinter)-&gt;printClosure($closure);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-keyword">use</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-operator">&amp;</span><span class="prism-token prism-variable">$c</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-variable">$a</span> <span class="prism-token prism-operator">+</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-short-arrow-functions">Short Arrow Functions<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-short-arrow-functions"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>You can also output a short anonymous function using the printer:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$closure</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Closure</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'$a + $b'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'a'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$closure</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'b'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Printer</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">printArrowFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$closure</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">fn</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-variable">$a</span> <span class="prism-token prism-operator">+</span> <span class="prism-token prism-variable">$b</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-method-and-function-signatures">Method and Function Signatures<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-method-and-function-signatures"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Methods are represented by the class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Method.html">Method</a>. You can set visibility, return value,
add comments, <a href="#toc-attributes">attributes</a>,&nbsp;etc.:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'count'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Count it.'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setFinal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setProtected</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setReturnType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'?int'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Individual parameters are represented by the class <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Parameter.html">Parameter</a>. Again, you can set all
conceivable properties:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'items'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// $items = []</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setReference</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>           <span class="prism-token prism-comment">// &amp;$items = []</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'array'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>        <span class="prism-token prism-comment">// array &amp;$items = []</span>

<span class="prism-token prism-comment">// function count(&amp;$items = [])</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>To define the so-called variadics parameters (or also the splat, spread, ellipsis, unpacking or three dots operator), use
<code>setVariadic()</code>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'count'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setVariadic</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'items'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>This generates:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">count</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-operator">...</span><span class="prism-token prism-variable">$items</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-method-and-function-bodies">Method and Function Bodies<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-method-and-function-bodies"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The body can be passed all at once to the <code>setBody()</code> method or gradually (line by line) by repeatedly calling
<code>addBody()</code>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'$a = rand(10, 20);'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return $a;'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$function</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-variable">$a</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-function">rand</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-number">10</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">20</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can use special placeholders for easy variable insertion.</p>

<p>Simple placeholders <code>?</code></p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$str</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-string prism-single-quoted-string">'any string'</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$num</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return substr(?, ?);'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$str</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$num</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$function</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-function">substr</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'any string'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Placeholder for variadic <code>...?</code></p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$items</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'myfunc(...?);'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$items</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$function</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-function">myfunc</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can also use named parameters for PHP 8&nbsp;with <code>...?:</code></p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$items</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'bar'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'myfunc(...?:);'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$items</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// myfunc(foo: 1, bar: true);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The placeholder is escaped with a backslash <code>\?</code></p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$num</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'a'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'return $a \? 10 : ?;'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$num</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$function</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The result is:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">return</span> <span class="prism-token prism-variable">$a</span> <span class="prism-token prism-operator">?</span> <span class="prism-token prism-number">10</span> <span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-number">3</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-printer-and-psr-compliance">Printer and PSR Compliance<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-printer-and-psr-compliance"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/Printer.html">Printer</a> class is used for
generating PHP&nbsp;code:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// ...</span>

<span class="prism-token prism-variable">$printer</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Printer</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$printer</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">printClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// same as: echo $class</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>It can generate code for all other elements, offering methods like <code>printFunction()</code>,
<code>printNamespace()</code>,&nbsp;etc.</p>

<p>There's&nbsp;also the <code>PsrPrinter</code> class, which outputs in accordance with PSR-2 / PSR-12 / PER coding&nbsp;style:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$printer</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>PsrPrinter</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$printer</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">printClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Need custom behavior? Create your own version by inheriting the <code>Printer</code> class. You can reconfigure these
variables:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">MyPrinter</span> <span class="prism-token prism-keyword">extends</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Printer</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-comment">// length of the line after which the line will break</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">int</span> <span class="prism-token prism-variable">$wrapLength</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">120</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// indentation character, can be replaced with a sequence of spaces</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">string</span> <span class="prism-token prism-variable">$indentation</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-string prism-double-quoted-string">"\t"</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// number of blank lines between properties</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">int</span> <span class="prism-token prism-variable">$linesBetweenProperties</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">0</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// number of blank lines between methods</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">int</span> <span class="prism-token prism-variable">$linesBetweenMethods</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// number of blank lines between 'use statements' groups for classes, functions, and constants</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">int</span> <span class="prism-token prism-variable">$linesBetweenUseTypes</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">0</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// position of the opening curly brace for functions and methods</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">bool</span> <span class="prism-token prism-variable">$bracesOnNextLine</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// place one parameter on one line, even if it has an attribute or is supported</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">bool</span> <span class="prism-token prism-variable">$singleParameterOnOneLine</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-constant prism-boolean">false</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// omits namespaces that do not contain any class or function</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">bool</span> <span class="prism-token prism-variable">$omitEmptyNamespaces</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-comment">// separator between the right parenthesis and return type of functions and methods</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword prism-type-declaration">string</span> <span class="prism-token prism-variable">$returnTypeColon</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-string prism-single-quoted-string">': '</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>How and why does the standard <code>Printer</code> differ from <code>PsrPrinter</code>? Why isn't there just one printer, the
<code>PsrPrinter</code>, in the package?</p>

<p>The standard <code>Printer</code> formats the code as we do throughout Nette. Since Nette was established much earlier than
PSR, and also because PSR took years to deliver standards on time, sometimes even several years after introducing a new feature in
PHP, it resulted in a <a href="https://doc.nette.org/en/contributing/coding-standard">coding standard</a> that differs in a few
minor aspects. The major difference is the use of tabs instead of spaces. We know that by using tabs in our projects, we allow for
width customization, which is essential for <a href="https://doc.nette.org/en/contributing/coding-standard#toc-tabs-instead-of-spaces">people with visual impairments</a>. An
example of a minor difference is placing the curly brace on a separate line for functions and methods, always. The PSR
recommendation seems illogical to us and leads to <a href="https://doc.nette.org/en/contributing/coding-standard#toc-wrapping-and-braces">reduced code clarity</a>.</p>

<h2 id="toc-types">Types<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-types"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Every type or union/intersection type can be passed as a string; you can also use predefined constants for native&nbsp;types:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Type</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$member</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'array'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// or Type::Array;</span>
<span class="prism-token prism-variable">$member</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'?array'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// or Type::nullable(Type::Array);</span>
<span class="prism-token prism-variable">$member</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'array|string'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// or Type::union(Type::Array, Type::String)</span>
<span class="prism-token prism-variable">$member</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo&amp;Bar'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// or Type::intersection(Foo::class, Bar::class)</span>
<span class="prism-token prism-variable">$member</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-constant">null</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// removes the type</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The same applies to the <code>setReturnType()</code> method.</p>

<h2 id="toc-literals">Literals<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-literals"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Using <code>Literal</code>, you can pass any PHP code, for example, for default property values or parameters,&nbsp;etc:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Literal</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addProperty</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name">Literal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Iterator::SELF_FIRST'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'bar'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'id'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name">Literal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'1 + 2'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Result:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-variable">$foo</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Iterator<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-constant">SELF_FIRST</span><span class="prism-token prism-punctuation">;</span>

	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">bar</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$id</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-number">1</span> <span class="prism-token prism-operator">+</span> <span class="prism-token prism-number">2</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-punctuation">}</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>You can also pass parameters to <code>Literal</code> and have them formatted into valid PHP code using <a href="#toc-method-and-function-bodies">placeholders</a>:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">new</span> <span class="prism-token prism-function">Literal</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'substr(?, ?)'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// generates for example: substr('hello', 5);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>A&nbsp;literal representing the creation of a new object can easily be generated using the <code>new</code> method:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-scope">Literal<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">new</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">Demo<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'foo'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-variable">$b</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// generates for example: new Demo(10, foo: 20)</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-attributes">Attributes<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-attributes"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>With PHP 8, you can add attributes to all classes, methods, properties, constants, enum cases, functions, closures, and
parameters. You can also use <a href="#toc-literals">literals</a> as parameter values.</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addAttribute</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Table'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span>
	<span class="prism-token prism-string prism-single-quoted-string">'name'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-string prism-single-quoted-string">'user'</span><span class="prism-token prism-punctuation">,</span>
	<span class="prism-token prism-string prism-single-quoted-string">'constraints'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-punctuation">[</span>
		<span class="prism-token prism-scope">Literal<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">new</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'UniqueConstraint'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'name'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-string prism-single-quoted-string">'ean'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'columns'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'ean'</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">,</span>
	<span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">,</span>
<span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addProperty</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'list'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addAttribute</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Deprecated'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'count'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addAttribute</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\Cached'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'mode'</span> <span class="prism-token prism-operator">=&gt;</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'items'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addAttribute</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Bar'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Result:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-attribute"><span class="prism-token prism-delimiter prism-punctuation">#[</span><span class="prism-token prism-attribute-content"><span class="prism-token prism-attribute-class-name prism-class-name">Table</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-attribute-class-name prism-class-name">name</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-string prism-single-quoted-string">'user'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-attribute-class-name prism-class-name">constraints</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-attribute-class-name prism-class-name">new</span> <span class="prism-token prism-attribute-class-name prism-class-name">UniqueConstraint</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-attribute-class-name prism-class-name">name</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-string prism-single-quoted-string">'ean'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-attribute-class-name prism-class-name">columns</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'ean'</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">)</span></span><span class="prism-token prism-delimiter prism-punctuation">]</span></span>
<span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-attribute"><span class="prism-token prism-delimiter prism-punctuation">#[</span><span class="prism-token prism-attribute-content"><span class="prism-token prism-attribute-class-name prism-class-name">Deprecated</span></span><span class="prism-token prism-delimiter prism-punctuation">]</span></span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-variable">$list</span><span class="prism-token prism-punctuation">;</span>


	<span class="prism-token prism-attribute"><span class="prism-token prism-delimiter prism-punctuation">#[</span><span class="prism-token prism-attribute-content"><span class="prism-token prism-attribute-class-name prism-class-name prism-class-name-fully-qualified">Foo<span class="prism-token prism-punctuation">\</span>Cached</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-attribute-class-name prism-class-name">mode</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-attribute-class-name prism-class-name">true</span><span class="prism-token prism-punctuation">)</span></span><span class="prism-token prism-delimiter prism-punctuation">]</span></span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">count</span><span class="prism-token prism-punctuation">(</span>
		<span class="prism-token prism-attribute"><span class="prism-token prism-delimiter prism-punctuation">#[</span><span class="prism-token prism-attribute-content"><span class="prism-token prism-attribute-class-name prism-class-name">Bar</span></span><span class="prism-token prism-delimiter prism-punctuation">]</span></span>
		<span class="prism-token prism-variable">$items</span><span class="prism-token prism-punctuation">,</span>
	<span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-punctuation">}</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-namespace">Namespace<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-namespace"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Classes, traits, interfaces, and enums (hereafter referred to as classes) can be grouped into namespaces represented by the <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/PhpNamespace.html">PhpNamespace</a>&nbsp;class:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$namespace</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>PhpNamespace</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// create new classes in the namespace</span>
<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Task'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$interface</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addInterface</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Countable'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$trait</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addTrait</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'NameAware'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or insert an existing class into the namespace</span>
<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Task'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">add</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>If the class already exists, an exception is thrown.</p>

<p>You can define use clauses:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-comment">// use Http\Request;</span>
<span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addUse</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">Http<span class="prism-token prism-punctuation">\</span>Request<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// use Http\Request as HttpReq;</span>
<span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addUse</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">Http<span class="prism-token prism-punctuation">\</span>Request<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'HttpReq'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// use function iter\range;</span>
<span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addUseFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'iter\range'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>To simplify a fully qualified class, function, or constant name based on defined aliases, use the <code>simplifyName</code>
method:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">simplifyName</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\Bar'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// 'Bar', because 'Foo' is the current namespace</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">simplifyName</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'iter\range'</span><span class="prism-token prism-punctuation">,</span> $<span class="prism-token prism-scope">namespace<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-constant">NameFunction</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// 'range', due to the defined use-statement</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Conversely, you can convert a simplified class, function, or constant name back to a fully qualified name using the
<code>resolveName</code> method:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">resolveName</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Bar'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// 'Foo\Bar'</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">resolveName</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'range'</span><span class="prism-token prism-punctuation">,</span> $<span class="prism-token prism-scope">namespace<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-constant">NameFunction</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// 'iter\range'</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-class-names-resolving">Class Names Resolving<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-class-names-resolving"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p><b>When a class is part of a namespace, it's&nbsp;rendered slightly differently:</b> all types (e.g., type hints, return types,
parent class name, implemented interfaces, used traits, and attributes) are automatically <i>resolved</i> (unless you turn it off,
see below). This means you must use <b>fully qualified class names</b> in definitions, and they will be replaced with aliases
(based on use clauses) or fully qualified names in the resulting&nbsp;code:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$namespace</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>PhpNamespace</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addUse</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Bar\AliasedClass'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addImplement</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\A'</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-comment">// will be simplified to A</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addTrait</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Bar\AliasedClass'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// will be simplified to AliasedClass</span>

<span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$class</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'method'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'@return '</span> <span class="prism-token prism-operator">.</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">simplifyType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\D'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// we manually simplify in comments</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addParameter</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'arg'</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Bar\OtherClass'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// will be translated to \Bar\OtherClass</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or use the PsrPrinter for output in accordance with PSR-2 / PSR-12 / PER</span>
<span class="prism-token prism-comment">// echo (new Nette\PhpGenerator\PsrPrinter)-&gt;printNamespace($namespace);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Result:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-keyword">namespace</span> <span class="prism-token prism-package">Foo</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">Bar<span class="prism-token prism-punctuation">\</span>AliasedClass</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span> <span class="prism-token prism-keyword">implements</span> <span class="prism-token prism-class-name">A</span>
<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-keyword">use</span> <span class="prism-token prism-package">AliasedClass</span><span class="prism-token prism-punctuation">;</span>

	<span class="prism-token prism-comment">/**
	 * @return D
	 */</span>
	<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">method</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-class-name prism-class-name-fully-qualified prism-type-declaration"><span class="prism-token prism-punctuation">\</span>Bar<span class="prism-token prism-punctuation">\</span>OtherClass</span> <span class="prism-token prism-variable">$arg</span><span class="prism-token prism-punctuation">)</span>
	<span class="prism-token prism-punctuation">{</span>
	<span class="prism-token prism-punctuation">}</span>
<span class="prism-token prism-punctuation">}</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Auto-resolving can be turned off this way:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$printer</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Printer</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// or PsrPrinter</span>
<span class="prism-token prism-variable">$printer</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setTypeResolving</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-constant prism-boolean">false</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$printer</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">printNamespace</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$namespace</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-php-files">PHP Files<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-php-files"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>Classes, functions, and namespaces can be grouped into PHP files represented by the <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/PhpFile.html">PhpFile</a>&nbsp;class:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$file</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>PhpFile</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$file</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addComment</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'This file is auto-generated.'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$file</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setStrictTypes</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// adds declare(strict_types=1)</span>

<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$file</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addClass</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\A'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$file</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">addFunction</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Foo\foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or</span>
<span class="prism-token prism-comment">// $namespace = $file-&gt;addNamespace('Foo');</span>
<span class="prism-token prism-comment">// $class = $namespace-&gt;addClass('A');</span>
<span class="prism-token prism-comment">// $function = $namespace-&gt;addFunction('foo');</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$file</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// or use the PsrPrinter for output in accordance with PSR-2 / PSR-12 / PER</span>
<span class="prism-token prism-comment">// echo (new Nette\PhpGenerator\PsrPrinter)-&gt;printFile($file);</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>Result:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-php prism-language-php"><span class="prism-token prism-delimiter prism-important">&lt;?php</span>

<span class="prism-token prism-comment">/**
 * This file is auto-generated.
 */</span>

<span class="prism-token prism-keyword">declare</span><span class="prism-token prism-punctuation">(</span>strict_types<span class="prism-token prism-operator">=</span><span class="prism-token prism-number">1</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">namespace</span> <span class="prism-token prism-package">Foo</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">A</span>
<span class="prism-token prism-punctuation">{</span>
<span class="prism-token prism-punctuation">}</span>

<span class="prism-token prism-keyword">function</span> <span class="prism-token prism-function-definition prism-function">foo</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-punctuation">)</span>
<span class="prism-token prism-punctuation">{</span>
<span class="prism-token prism-punctuation">}</span>
</span></code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p><b>Please note:</b> No additional code can be added to the files outside of functions and classes.</p>

<h2 id="toc-generating-from-existing-ones">Generating from Existing Ones<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-generating-from-existing-ones"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>In addition to being able to model classes and functions using the API described above, you can also have them automatically
generated using existing&nbsp;ones:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-comment">// creates a class identical to the PDO class</span>
<span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">from</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">PDO<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// creates a function identical to the trim() function</span>
<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">from</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'trim'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-comment">// creates a closure based on the provided one</span>
<span class="prism-token prism-variable">$closure</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Closure<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">from</span><span class="prism-token prism-punctuation">(</span>
	<span class="prism-token prism-keyword">function</span> <span class="prism-token prism-punctuation">(</span><span class="prism-token prism-class-name prism-type-declaration">stdClass</span> <span class="prism-token prism-variable">$a</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-variable">$b</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-constant">null</span><span class="prism-token prism-punctuation">)</span> <span class="prism-token prism-punctuation">{</span><span class="prism-token prism-punctuation">}</span><span class="prism-token prism-punctuation">,</span>
<span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>By default, function and method bodies are empty. If you also want to load them, use this method (requires the
<code>nikic/php-parser</code> package to be installed):</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">from</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">Foo<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-argument-name">withBodies</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$function</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>GlobalFunction<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">from</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-argument-name">withBody</span><span class="prism-token prism-punctuation">:</span> <span class="prism-token prism-constant prism-boolean">true</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-loading-from-php-files">Loading from PHP Files<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-loading-from-php-files"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>You can also load functions, classes, interfaces, and enums directly from a string containing PHP code. For example, to create
a <code>ClassType</code> object:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php">$class = Nette\PhpGenerator\ClassType::fromCode(&lt;&lt;&lt;XX
	<span class="prism-token prism-php prism-language-php"><span class="prism-token prism-delimiter prism-important">&lt;?php</span>

	<span class="prism-token prism-keyword">class</span> <span class="prism-token prism-class-name-definition prism-class-name">Demo</span>
	<span class="prism-token prism-punctuation">{</span>
		<span class="prism-token prism-keyword">public</span> <span class="prism-token prism-variable">$foo</span><span class="prism-token prism-punctuation">;</span>
	<span class="prism-token prism-punctuation">}</span>
	<span class="prism-token prism-constant">XX</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</span></code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>When loading classes from PHP code, single-line comments outside method bodies are ignored (e.g., for properties, etc.), as
this library doesn't have an API to work with&nbsp;them.</p>

<p>You can also directly load an entire PHP file, which can contain any number of classes, functions, or even namespaces:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$file</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-scope">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>PhpFile<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-function">fromCode</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-function">file_get_contents</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'classes.php'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The file's&nbsp;initial comment and <code>strict_types</code> declaration are also loaded. However, all other global code is
ignored.</p>

<p>It requires <code>nikic/php-parser</code> to be installed.</p>

<p class="note">If you need to manipulate global code in files or individual statements in method bodies, it's&nbsp;better to use the
<code>nikic/php-parser</code> library directly.</p>

<h2 id="toc-class-manipulator">Class Manipulator<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-class-manipulator"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The <a href="https://api.nette.org/php-generator/master/Nette/PhpGenerator/ClassManipulator.html">ClassManipulator</a> class
provides tools for manipulating classes.</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$class</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassType</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'Demo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$manipulator</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>ClassManipulator</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The <code>inheritMethod()</code> method copies a method from a parent class or implemented interface into your class. This
allows you to override the method or extend its signature:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$method</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$manipulator</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">inheritMethod</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'bar'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$method</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setBody</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'...'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The <code>inheritProperty()</code> method copies a property from a parent class into your class. This is useful when you want
to have the same property in your class, but possibly with a different default&nbsp;value:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$property</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-variable">$manipulator</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">inheritProperty</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'foo'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-variable">$property</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">setValue</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-string prism-single-quoted-string">'new value'</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<p>The <code>implementInterface()</code> method automatically implements all methods from the given interface in your&nbsp;class:</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$manipulator</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">implementInterface</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-scope">SomeInterface<span class="prism-token prism-punctuation">::</span></span><span class="prism-token prism-keyword">class</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span>
<span class="prism-token prism-comment">// Now your class implements SomeInterface and includes all its methods</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-variable-dumping">Variable Dumping<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-variable-dumping"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>The <code>Dumper</code> class converts a variable into parseable PHP code. It provides a better and clearer output than the
standard <code>var_export()</code> function.</p>

<div class="code-toolbar"><pre class="language-php" tabindex="0"><code class="language-php"><span class="prism-token prism-variable">$dumper</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-keyword">new</span> <span class="prism-token prism-class-name prism-class-name-fully-qualified">Nette<span class="prism-token prism-punctuation">\</span>PhpGenerator<span class="prism-token prism-punctuation">\</span>Dumper</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-variable">$var</span> <span class="prism-token prism-operator">=</span> <span class="prism-token prism-punctuation">[</span><span class="prism-token prism-string prism-single-quoted-string">'a'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-string prism-single-quoted-string">'b'</span><span class="prism-token prism-punctuation">,</span> <span class="prism-token prism-number">123</span><span class="prism-token prism-punctuation">]</span><span class="prism-token prism-punctuation">;</span>

<span class="prism-token prism-keyword">echo</span> <span class="prism-token prism-variable">$dumper</span><span class="prism-token prism-operator">-&gt;</span><span class="prism-token prism-function">dump</span><span class="prism-token prism-punctuation">(</span><span class="prism-token prism-variable">$var</span><span class="prism-token prism-punctuation">)</span><span class="prism-token prism-punctuation">;</span> <span class="prism-token prism-comment">// outputs ['a', 'b', 123]</span>
</code></pre><div class="toolbar"><div class="toolbar-item"><button class="copy-to-clipboard-button" type="button" data-copy-state="copy"><span>Copy</span></button></div><div class="toolbar-item"><button type="button" title="Run on Fiddle" class="toolbar-button-run">Run on Fiddle</button></div></div></div>

<h2 id="toc-compatibility-table">Compatibility Table<a aria-hidden="true" class="content-anchor" title="copy URL" href="#toc-compatibility-table"><svg width="15" height="15" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a></h2>

<p>PhpGenerator 4.0&nbsp;and 4.1&nbsp;are compatible with PHP 8.0&nbsp;to&nbsp;8.3.</p>

	</main>


	<nav class="pagination" aria-label="pagination">
			<a href="/en/schema" class="pagination-previous">◄&nbsp;Schema: Data Validation</a>
			<span disabled="" class="pagination-next">next</span>
	</nav>





	<div class="leftbar-toggle"><svg viewBox="0 0 64 64"><path d="m50 8h-36c-3.309 0-6 2.691-6 6v36c0 3.309 2.691 6 6 6h36c3.309 0 6-2.691 6-6v-36c0-3.309-2.691-6-6-6zm-38 42v-36c0-1.103.897-2 2-2h8v40h-8c-1.103 0-2-.897-2-2zm40 0c0 1.103-.897 2-2 2h-24v-40h24c1.103 0 2 .897 2 2z"></path></svg></div>

	<div class="topbar">
		<ol class="breadcrumbs" aria-label="breadcrumbs">
			<li><a href="/en/">Documentation</a></li>
			<li>PHP Code Generator</li>
		</ol>

		<div class="versions">
			version:
			<a href="/en/php-generator" class="active">4.0</a>
			<a href="/en/php-generator/3.x">3.x</a>
			<a href="/en/php-generator/2.x">2.x</a>
		</div>
	</div>
				</div>

	<aside class="leftbar">
		<div class="leftbar-sticky">
			<nav class="leftbar-menu">
			<h3 id="toc-main-topics">Main Topics</h3>

<ul>
	<li><a href="https://doc.nette.org/en/configuring">Configuration</a></li>

	<li><a href="https://doc.nette.org/en/application/how-it-works">Nette Application</a></li>

	<li><a href="https://doc.nette.org/en/dependency-injection">Dependency Injection</a></li>

	<li><a href="https://doc.nette.org/en/utils">Utilities</a></li>

	<li><a href="https://doc.nette.org/en/forms">Forms</a></li>

	<li><a href="https://doc.nette.org/en/database/core">Database</a></li>

	<li><a href="https://doc.nette.org/en/security/authentication">Authenticating Users</a></li>

	<li><a href="https://doc.nette.org/en/security/authorization">Access Control</a></li>

	<li><a href="https://doc.nette.org/en/http/sessions">Sessions</a></li>

	<li><a href="https://doc.nette.org/en/http">HTTP request &amp; response</a></li>

	<li><a href="https://doc.nette.org/en/caching">Caching</a></li>

	<li><a href="https://doc.nette.org/en/mail">Emails Sending</a></li>

	<li><a href="https://doc.nette.org/en/schema">Schema: Data Validation</a></li>

	<li><a class="active" href="https://doc.nette.org/en/php-generator">PHP Code Generator</a></li>
</ul>

<ul>
	<li><a href="https://latte.nette.org/en/">Latte: templates</a></li>

	<li><a href="https://tracy.nette.org/en/">Tracy: debugging</a></li>

	<li><a href="https://tester.nette.org/en/">Tester: testing</a></li>
</ul>

			</nav>
		</div>
	</aside>
	<aside class="sidebar">
		<ul class="sidebar-links">
			<li style="flex: 1 0 100%">package: <b style="white-space: nowrap">nette/php-generator</b></li>
			<li><a href="https://github.com/nette/php-generator" target="_blank" rel="noopener">GitHub</a></li>
			<li><a href="https://api.nette.org/php-generator/" target="_blank">API</a></li>
		</ul>

		<div class="sidebar-toc">
			<h4>Contents</h4>

			<ul>
				<li><a href="#">Intro</a></li>
					<li><a href="#toc-installation">Installation</a>
					</li>
					<li><a href="#toc-classes">Classes</a>
					</li>
					<li><a href="#toc-interfaces-or-traits">Interfaces or Traits</a>
					</li>
					<li><a href="#toc-enums">Enums</a>
					</li>
					<li><a href="#toc-anonymous-classes">Anonymous Classes</a>
					</li>
					<li><a href="#toc-global-functions">Global Functions</a>
					</li>
					<li><a href="#toc-anonymous-functions">Anonymous Functions</a>
					</li>
					<li><a href="#toc-short-arrow-functions">Short Arrow Functions</a>
					</li>
					<li><a href="#toc-method-and-function-signatures">Method and Function Signatures</a>
					</li>
					<li><a href="#toc-method-and-function-bodies">Method and Function Bodies</a>
					</li>
					<li><a href="#toc-printer-and-psr-compliance">Printer and PSR Compliance</a>
					</li>
					<li><a href="#toc-types">Types</a>
					</li>
					<li><a href="#toc-literals">Literals</a>
					</li>
					<li><a href="#toc-attributes">Attributes</a>
					</li>
					<li><a href="#toc-namespace">Namespace</a>
					</li>
					<li><a href="#toc-class-names-resolving">Class Names Resolving</a>
					</li>
					<li><a href="#toc-php-files">PHP Files</a>
					</li>
					<li><a href="#toc-generating-from-existing-ones">Generating from Existing Ones</a>
					</li>
					<li><a href="#toc-loading-from-php-files">Loading from PHP Files</a>
					</li>
					<li><a href="#toc-class-manipulator">Class Manipulator</a>
					</li>
					<li><a href="#toc-variable-dumping">Variable Dumping</a>
					</li>
					<li><a href="#toc-compatibility-table">Compatibility Table</a>
					</li>
			</ul>


		</div>
	</aside>
			</div>

<div class="minimenu minimenu--wiki">
	<div>
		<div><img src="https://files.nette.org/images/edit-button.svg?v=1612307862" width="20"></div>
		<ul>
			<li><a href="https://github.com/nette/docs/blob/master/php-generator/en/@home.texy" target="_blank" rel="noopener">Show on GitHub</a></li>

			<li><a href="https://editor.nette.org/?url=https%3A%2F%2Fgithub.com%2Fnette%2Fdocs%2Fblob%2Fmaster%2Fphp-generator%2Fen%2F%40home.texy" target="_blank" rel="noopener">Open preview</a></li>

			<li><a href="/en/contributing/documentation">How to write?</a></li>

			<li>changed Sep 18, 2024</li>

			<li><a href="/en/php-generator?view=links" rel="nofollow">Backlinks</a> | <a href="https://nette.org/special/broken-links" rel="nofollow">Broken links</a></li>

			<li><a href="https://nette.org/special/all-pages">All pages</a></li>
		</ul>
	</div>
</div>
		</div>
		</div>
	</section>

	<footer class="footer">
		<div class="container">
			<div class="flex is-multiline is-always footer-columns">
				<div class="is-narrow">
					<h6>Check our other projects</h6>
					<ul>
						<li><a href="https://doc.nette.org/en/application">Web Framework <span>component-based MVC</span></a></li>
						<li><a href="https://latte.nette.org/">Latte <span>the safest &amp; intuitive templates</span></a></li>
						<li><a href="https://tester.nette.org/">Tester <span>enjoyable unit testing in PHP</span></a></li>
						<li><a href="https://tracy.nette.org/">Tracy <span>debugging tool you will love ♥</span></a></li>
						<li><a href="https://doc.nette.org/en/dependency-injection">Dependency Injection <span>challenging container</span></a></li>
						<li><a href="https://doc.nette.org/en/caching">Caching</a></li>
						<li><a href="https://doc.nette.org/en/database">Database <span>layer for PHP</span></a></li>
						<li><a href="https://doc.nette.org/en/forms">Forms <span>greatly facilitates web forms</span></a></li>
						<li><a href="https://doc.nette.org/en/mail">Mail <span>sending emails</span></a></li>
						<li><a href="https://doc.nette.org/en/neon">Neon <span>readable file format</span></a></li>
						<li><a href="https://doc.nette.org/en/php-generator">PHP Code Generator</a></li>
						<li><a href="https://doc.nette.org/en/schema">Schema <span>user data validation</span></a></li>
						<li><a href="https://doc.nette.org/en/utils">Utils <span>collection of useful utilities</span></a></li>
						<li><a href="https://nette.org/en/packages">…list of all packages</a></li>
					</ul>
				</div>

				<div class="is-narrow">
					<h6>Help &amp; Support</h6>
					<ul>
						<li><a href="https://forum.nette.org/en/">Forum</a></li>
						<li><a href="https://discord.gg/azXxTbuQVq">Discord Nette</a></li>
						<li><a href="https://nette.org/en/releases">Release Notes</a></li>
						<li><a href="https://commits.nette.org">Commits</a></li>
					</ul>

					<h6>Learn</h6>
					<ul>
						<li><a href="https://doc.nette.org">Documentation</a></li>
						<li><a href="https://blog.nette.org">Blog</a></li>
						<li><a href="https://api.nette.org">API</a></li>
						<li><a href="https://nette.org/en/history">About Nette</a></li>
					</ul>
				</div>

				<div class="is-narrow">
					<h6>Community</h6>
					<ul>
						<li><a href="https://nette.org/en/donate#platinum-partner">Partners and sponsors</a></li>
						<li><a href="https://github.com/nette">GitHub</a></li>
						<li><a href="https://componette.org">Componette</a></li>
						<li><a href="https://nette.org/contributors">Hall of Fame</a></li>
						<li><a href="https://builtwith.nette.org/">Showcase</a></li>
					</ul>
					<ul>
						<li><a href="https://nette.org/donate">Donate Now</a></li>
					</ul>
				</div>
				<div class="is-narrow footer-newsletter">
					<h6>Choose your language</h6>

					<ul>
							<li><b><a href="https://doc.nette.org/en/php-generator" hreflang="en">English</a></b></li>
							<li><a href="https://doc.nette.org/cs/php-generator" hreflang="cs">Česky</a></li>
							<li><a href="https://doc.nette.org/de/php-generator" hreflang="de">Deutsch</a></li>
							<li><a href="https://doc.nette.org/es/php-generator" hreflang="es">Español</a></li>
							<li><a href="https://doc.nette.org/fr/php-generator" hreflang="fr">Français</a></li>
							<li><a href="https://doc.nette.org/it/php-generator" hreflang="it">Italiano</a></li>
							<li><a href="https://doc.nette.org/hu/php-generator" hreflang="hu">Magyar</a></li>
							<li><a href="https://doc.nette.org/pl/php-generator" hreflang="pl">Polska</a></li>
							<li><a href="https://doc.nette.org/pt/php-generator" hreflang="pt">Português</a></li>
							<li><a href="https://doc.nette.org/ro/php-generator" hreflang="ro">Română</a></li>
							<li><a href="https://doc.nette.org/sl/php-generator" hreflang="sl">Slovenski</a></li>
							<li><a href="https://doc.nette.org/tr/php-generator" hreflang="tr">Türkçe</a></li>
							<li><a href="https://doc.nette.org/el/php-generator" hreflang="el">Ελληνικά</a></li>
							<li><a href="https://doc.nette.org/bg/php-generator" hreflang="bg">Български</a></li>
							<li><a href="https://doc.nette.org/ru/php-generator" hreflang="ru">Русский</a></li>
							<li><a href="https://doc.nette.org/uk/php-generator" hreflang="uk">Українська</a></li>
							<li><a href="https://doc.nette.org/ja/php-generator" hreflang="ja">日本語</a></li>
					</ul>

					<h6>Follow us</h6>

					<div class="social-big-icons">
						<a href="https://blog.nette.org" title="Nette Blog"><img src="https://files.nette.org/images/icon-blog.png?v=1612307863" alt="Nette Blog"></a>
						<a href="https://twitter.com/nettefw" title="Twitter"><img src="https://files.nette.org/images/icon-twitter.png?v=1612307863" alt="Twitter"></a>
					</div>
				</div>
			</div>

			<hr>

			<p>Hosted on e-infrastructure <a href="https://www.cesnet.cz/sluzby/">CESNET</a>. Thank you for your support CESNET association</p>

			<p>© 2008, 2024 <a href="https://davidgrudl.com">David Grudl</a>. All rights reserved. &nbsp;
				<a href="https://nette.org/terms-of-use">Terms of use</a>
				<a style="float:right" href="#top">▲ up</a></p>
		</div>
	</footer>


</body></html>