🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ دانشجوی سون‌لرن
دلیل استفاده از static
جامعه لاراول ایجاد شده در ۰۲ آذر ۱۴۰۰
<p>سلام استاد چرا موقع فراخوانی یک ثابت در کلاس و trait از self استفاده نمی‌کنید و از کلمه کلیدی static استفاده میکنید؟</p>
<p>سلام وقت بخیر </p><p>در برنامه نویسی PHP موضوعی وجود دارد به نام Late static binding این موضوع بدین معناس که زمانی که مفسر در PHP عمل تفسیر خط به خط کد هارو انجام میدهد، اگر یک پراپرتی ثابتی وجود داشته باشه در برخود با آن، آنرا مقدار دهی میکند . حال اگر از کلمه کلیدی SELF برای فراخوانی استفاده کنیم اولین مقداری که به این پراپرتی توسط مفسر نسبت داده شده در طول اجرا و حتی در فرزندان آن کلاس ثابت خواهد ( اولین مقدار در تمام فرزندان یکسان می‌باشد و قابل تغییر نمی‌باشد ) بود ، ولی با استفاده از کلمه کلیدی Static در فرزند دان شما توانایی تغییر مقدار رو دارید و این مقدار می‌تواند برای هر فرزند منحصر به آن کلاس فرزند باشد .</p><p> برای درک بهت مثال زیر رو در نظر بگیرید :</p><pre class="ql-syntax" spellcheck="false"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Parent</span> </span>{   <span class="hljs-keyword">protected</span> <span class="hljs-built_in">static</span> <span class="hljs-variable">$name</span> = <span class="hljs-string">"Parent"</span>;   <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getName</span>()   </span>{     <span class="hljs-keyword">return</span> <span class="hljs-built_in">self</span>::<span class="hljs-variable">$name</span>;   }  }  <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Childe</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Parent</span> </span>{   <span class="hljs-keyword">protected</span> <span class="hljs-built_in">static</span> <span class="hljs-variable">$name</span> = <span class="hljs-string">"Childe"</span>; } <span class="hljs-variable">$newObject</span> = <span class="hljs-keyword">new</span> Childe ; <span class="hljs-keyword">echo</span> <span class="hljs-variable">$newObject</span> ; <span class="hljs-comment">//output ::>> "Parent"</span> ---------------------------------------------------------------------------------------- <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Parent</span> </span>{   <span class="hljs-keyword">protected</span> <span class="hljs-built_in">static</span> <span class="hljs-variable">$name</span> = <span class="hljs-string">"Parent"</span>;   <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getName</span>()   </span>{     <span class="hljs-keyword">return</span> <span class="hljs-built_in">static</span>::<span class="hljs-variable">$name</span>;   }  }  <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Childe</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Parent</span> </span>{   <span class="hljs-keyword">protected</span> <span class="hljs-built_in">static</span> <span class="hljs-variable">$name</span> = <span class="hljs-string">"Childe"</span>; } <span class="hljs-variable">$newObject</span> = <span class="hljs-keyword">new</span> Childe ; <span class="hljs-keyword">echo</span> <span class="hljs-variable">$newObject</span> ; <span class="hljs-comment">//output ::>> "Childe"</span> </pre><p>امیدوار هستم که پاسخ برای شما روشن و واضح توضیح داده شده باشد .</p>
محمد نقلانی ۰۲ آذر ۱۴۰۰، ۱۹:۴۱
<p>فکر کنم من اشتباه منظورمو گفتم منظور من استفاده از selfدر ثابت هایی بود که با const تعریف کرده بودیم.</p>
Mahdiabedini ۰۲ آذر ۱۴۰۰، ۲۰:۲۲
<p>سلام مهدی جان </p><p>با یک مثال مورد رو توضیح میدم :</p><p>فرض میکنیم یک کلاس (یا <span style="color: rgb(50, 74, 98);">trait ) داریم با ساختار زیر :</span></p><pre class="ql-syntax" spellcheck="false"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DataBase</span> </span>{ <span class="hljs-keyword">const</span> TBL_NAME = <span class="hljs-string">"undefined"</span> ; <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">selectAllFromTbl</span>() </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"SELECT * FROM "</span>; } } </pre><p>اگر ما از این کلاس برای توسعه کلاس User استفاده کنیم مقدار TBL_NAME در کلاس User باید تغییر کنه :</p><pre class="ql-syntax" spellcheck="false"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">DataBase</span> </span>{ <span class="hljs-keyword">const</span> TBL_NAME = <span class="hljs-string">"users"</span> ; } </pre><p>حالا اگر ما متود selectAllFromTbl رو با کلید self توسعه بدیم در کلاس DataBase و از کلاس User یک شئ بسازیم ، مفسر اولین مقدار در کلاس پدر رو درنظر میگیره (همون کلاس دیتابیس ) و زمانی که ما میخوایم اطلاعات کاربران رو درخواست بدیم سیستم با خطا مواجه میشه :</p><pre class="ql-syntax" spellcheck="false"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">selectAllFromTbl</span>() </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"SELECT * FROM "</span> . <span class="hljs-built_in">self</span>::TBL_NAME; } </pre><p>علت این خطا این هستش که خروجی متود بالا در زمانی که ما از کلاس User داریم استفاده میکنیم برابر با مقدار زیر هستش :</p><pre class="ql-syntax" spellcheck="false">SELECT * <span class="hljs-keyword">FROM</span> undefined </pre><p>برای این که جلوی این خطا گرفته بشه و مقدار دهی در کلاس جاری و مورد استفاده انجام بشه نه در کلاس پدر (ویا <span style="color: rgb(50, 74, 98);">trait ) در توسعه از کلیدواژه static استفاده میکنیم :</span></p><pre class="ql-syntax" spellcheck="false"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">selectAllFromTbl</span>() </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"SELECT * FROM "</span> . <span class="hljs-built_in">static</span>::TBL_NAME; } </pre><p>وخروجی برابر میشه با :</p><pre class="ql-syntax" spellcheck="false">SELECT * <span class="hljs-keyword">FROM</span> users </pre><p><br></p><p>جمع بندی :</p><p>در زمان هایی که ما در توسعه یک کلاس و یا یک <span style="color: rgb(50, 74, 98);">trait  پیشبینی به تغییر مقادیر ثابت در فرزندان و یا کلاس‌های مورد استفاده trait می‌کنیم استفاده از کلیدواژه ی static به ما کمک میکنه که اطلاعات رو از کلاس جاری دریافت کنیم نه از درون بدنه trait ویا کلاس پدر و روند اجرای نرم افزار بدون اشکال انجام شود .(</span><span style="color: rgb(50, 74, 98); background-color: rgb(243, 252, 254);">Late static binding)</span></p><p><br></p><p><span style="color: rgb(50, 74, 98);">امیدوار هستم این بار موفق شده باشم که جواب سوال شمارو کامل بدم .</span></p>
بهترین پاسخ
محمد نقلانی ۰۳ آذر ۱۴۰۰، ۰۵:۲۹