آموزش کامل PHP – قسمت 32: ایجاد فرم ورود و صفحه کاربری

در این جلسه از سری آموزش های php با پردیس وردپرس به آموزش ایجاد فرم ورود و صفحه کاربری می پردازیم. سیستم ورود کاربران به سایت از آموزش های بسیار کاربردی تحت وب است. اگر یادتان باشد در جلسات قبل در مورد Session ها صحبت کردیم. سشن‌ها در واقع متغیرهایی هستند که به منظور نگه‌داری اطلاعات شخصی کاربران بر روی سرورهای وب به کار گرفته می‌شوند. در صورتی که از این ویژگی استفاده نشود، وب‌سرور نمی‌تواند تشخیص دهد که کدام کاربر به سمت سرور درخواست ارسال کرده است.

در این جلسه‌ی آموزشی قصد دارید تا با استفاده از Session ها در پی‌اچ‌پی، یک سیستم‌ کاربری ساده که شامل فرم ورود کاربران عضو است را بر اساس درخواست‌های کاربر ایجاد کنیم. به منظور شروع یک سشن باید از کد زیر استفاده کنیم:

<?php
session_start();
// Do Something
?>

برای ذخیره‌ی مقادیر دلخواه در سشن‌ها می‌توانیم از کدی مثل زیر بهره ببریم:

<?php
session_start();
// Store Session Data
$_SESSION['login_user']= $username;  // Initializing Session with value of PHP Variable

برای خواندن اطلاعات ذخیره شده در سشن‌ها نیز باید از کدی مثل کد زیر استفاده کرد:

<?php
session_start();
// Store Session Data
$_SESSION['login_user']= $username;  // Initializing Session with value of PHP Variable
echo $_SESSION['login_user'];

برای خالی کردن اطلاعات ذخیره شده در یک سشن نیز می‌توان از کد زیر استفاده کرد:

<?php
session_destroy(); // Is Used To Destroy All Sessions
//Or
if(isset($_SESSION['id']))
unset($_SESSION['id']);  //Is Used To Destroy Specified Session

در مثال ما، یک فرم ورود خواهیم داشت که کاربر باید فیلد‌های آن را پر کرده و سپس روی دکمه‌ی ورود کلیک کند. سپس یک سشن ایجاد شده که در صورتی که کاربر اطلاعات ورود را به درستی وارد کرده باشد، داده‌هایی در این سشن ذخیره شده و به وی اجازه مشاهده صفحه‌ی مخصوص کاربران عضو داده می‌شود.

مثل همیشه پیش از شروع کار، برنامه‌ی Xampp را اجرا کرده و سپس در پوشه‌ی htdocs یک پوشه‌ی دلخواه برای این پروژه بسازید. در ادامه کد کامل فایل‌های مورد نیاز را مشاهده می‌کنید و توضیح در مورد این کدها نیز در ادامه آورده شده است. شما باید تک تک فایل‌هایی که در ادامه آورده شده را ساخته در این فایل‌ها کدهای مربوط را بنویسید.

فایل index.php

کد این فایل در واقع بیشتر HTML است و شامل یک فرم برای ورود اطلاعات کاربر است. این فرم دارای دو فیلد با نام username و password و یک دکمه به نام submit است. فیلد اول برای نام کاربری و فیلد دوم برای رمز عبور است. در ادامه کد این فایل را مشاهده می‌کنید:

<?php
include('login.php'); // Includes Login Script

if(isset($_SESSION['login_user'])){
header("location: profile.php");
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login Form in PHP with Session</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="main">
<h1>PHP Login - pardiswp</h1>
<div id="login">
<h2>Login Form</h2>
<form action="" method="post">
<label>UserName :</label>
<input id="name" name="username" placeholder="username" type="text">
<label>Password :</label>
<input id="password" name="password" placeholder="**********" type="password">
<input name="submit" type="submit" value=" Login ">
<span><?php echo $error; ?></span>
</form>
</div>
</div>
</body>
</html>

همانطور که در کد بالا مشاهده می‌کنید ابتدا با دستور include فایل login.php که در مرحله‌ی بعد آن را می‌سازیم به صفحه‌ی index.php اضافه شده است. سپس با دستور شرطی if بررسی می‌کنیم که آیا سشنی به نام login_user قبلا ست شده یا خیر. اگر مقدار این سشن خالی نباشد با دستور header، کاربر را به صفحه‌ای به نام profile.php منتقل می‌کنیم. در غیر این صورت کد اچ‌تی‌ام‌ال که در ادامه‌ی فایل نوشته شده اجرا خواهد شد و فرم ورود به کاربر نمایش داده می‌شود. دقت کنید که خاصیت action این فرم login.php است و این یعنی اطلاعات فرم یاد شده به فایلی به نام login.php ارسال خواهند شد.

در کد بالا خط echo $error باعث می‌شود تا مقدار متغیر error$ که در فایل login.php مقدار دهی می‌شود چاپ شود.

فایل login.php

این فایل شامل اسکریپت‌های پی‌اچ‌پی لازم برای بررسی ورود کاربر است. کد این فایل نیز به صورت زیر خواهد بود:

<?php
session_start(); // Starting Session
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password'])) {
$error = "Username or Password is invalid";
}
else
{
// Define $username and $password
$username=$_POST['username'];
$password=$_POST['password'];
// Establishing Connection with Server by passing server_name, user_id and password as a parameter
$connection = mysql_connect("localhost", "root", "");
// To protect MySQL injection for Security purpose
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
// Selecting Database
$db = mysql_select_db("company", $connection);
// SQL query to fetch information of registerd users and finds user match.
$query = mysql_query("select * from login where password='$password' AND username='$username'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {
$_SESSION['login_user']=$username; // Initializing Session
header("location: profile.php"); // Redirecting To Other Page
} else {
$error = "Username or Password is invalid";
}
mysql_close($connection); // Closing Connection
}
}
?>

در این فایل نیز ابتدا با دستور session_start سشن را آغاز می‌کنیم تا بتوانیم از آن در این فایل استفاده کنیم. دقت کنید که در هر فایلی که قصد کار کردن با سشن‌ها را داشته باشید ترجیحا در خطوط اولیه صفحه باید این دستور را بنویسیم.

سپس در این فایل یک متغیر به نام error$ ایجاد کرده‌ایم و مقدار آن را خالی گذاشته‌ایم. این متغیر برای نگه‌داری خطاهای احتمالی که طی فرایند ورود کاربر ایجاد می‌شوند مورد استفاده واقع می‌شوند.

در خط بعدی با استفاده از دستور isset همانطور که در بخش فرم‌ها به شما آموزش داده بودیم بررسی می‌کنیم که آیا کاربر اطلاعات مورد نیاز را وارد کرده یا خیر. اگر فیلد‌های نام کاربری و رمزعبور خالی باشند، مقدار متغیر error برابر با Username or Password is invalid خواهد شد. در غیر این صورت ادامه‌ی کد یعنی کدهای بعد از else اجرا خواهند شد. حال اگر کاربر نام کاربری و رمزعبور را وارد کرده باشد، مقادیر وارد شده توسط وی در دو متغیر به نام username و password ذخیره می‌شوند.

در جلسه ی بعد به بانک اطلاعاتی‌ که اطلاعات کاربران در آن ذخیره شده می پردازیم.

آموزش کامل PHP – قسمت 31: شئ گرایی 4

در این جلسه از آموزش php با پردیس وردپرس به بخش پایانی شئ گرایی در php می پردازیم.

مرحله‌ی هجدهم:

ارث بری یا استفاده مجدد از کدهای نوشته شده با ساختار OOP

ارث‌بری یکی از قابلیت‌های اساسی در برنامه‌نویسی شیءگرا محسوب می‌شود و با استفاده از آن می‌توان از یک کلاس به عنوان ساختار پایه برای کلاس‌های دیگر بهره برد. این عمل به شما اجازه می‌دهد تا به صورت بهینه‌تری از کدهای نوشته‌ شده‌ی قبلی خود و نیز کدهای نوشته شده توسط دیگران، استفاده کنید.

فرض کنید که قصد ایجاد یک کلاس جدید به نام employee (کارمند) را دارید. از آنجا که هر کارمند یک شخص است، بنابراین این دو می‌توانند پروپرتی‌ها و متدهای مشترکی داشته باشند.

با استفاده از ویژگی‌های ارث‌بری می‌توانید کد کمتر و بهینه‌تری را تولید کنید چراکه فقط موارد اضافه را باید به کلاس جدید اضافه کنید و در واقع می‌توان از ویژگی‌های یک کلاس دیگر به منظور ساخت کلاس جدید بهره گرفت. دو عامل زیر از جمله دلایلی تلقی می‌شوند که باعث شده استفاده از ارث‌بری در کلاس‌های پی‌اچ‌پی منطقی به نظر برسد:

  1. شما فقط یک بار باید کد مورد نظرتان را بنویسید.
  2. کد اولیه و اصلی مجددا استفاده خواهد شد و می‌توان از آن در هر تعداد کلاس دیگر، استفاده کرد.

از نظر مفهومی ارث‌بری شبیه به عملیات Include کردن است که در جلسات قبل به صورت مفصل آن را توضیح داده بودیم. به کد زیر توجه کنید:

// 'extends' is the keyword that enables inheritance
class employee extends person 
{
	function __construct($employee_name) {
		$this->set_name($employee_name);
	}
}

مرحله‌ی نوزدهم:

از آنجا که کلاس employee بر پایه‌ی کلاس person ایجاد شده است، بنابراین کلاس employee به طور خودکار تمامی متدهای عمومی و محافظت‌شده‌ و نیز تمامی پروپرتی‌های عمومی و محافظت‌شده‌ی کلاس person را دارا خواهد بود. به عبارت دیگر می‌توان گفت که کلاس employee در واقع نوعی دیگر از کلاس person است. به کد نمونه‌ی فوق توجه کنید تا مطلب بیان شده را بهتر درک کنید.

اما چگونه بدون اینکه متد ()set_name در کلاس employee تعریف شده باشد ما قادر به استفاده از آن خواهیم بود؟

ما قبلا متد ()set_name را در کلاس person تعریف کرده بودیم و با توجه به ویژگی‌ ارث‌بری در پی‌اچ‌پی، کلاس جدید می‌تواند از متدهای عمومی و محافظت‌شده‌ی کلاس پایه استفاده کند.

کلاس person در اینجا کلاس پایه یا کلاس والد خوانده می‌شود زیرا کلاس جدیدی که به نام employee ساختیم، به عنوان ساختار پایه از کلاس person بهره گرفته است. سسله مراتب همیشه در پروژه‌های مختلف پی‌اچ‌پی یک موضوع مهم است که باید به آن توجه ویژه داشته باشید. این امر به ویژه وقتی که پروژه‌ی شما پیچیده‌تر می‌شود بسیار کارا خواهد بود.

مرحله‌ی بیستم:

همانطور که در کد زیر نیز مشاهده می‌کنید، می‌توانیم متد get_name را در کلاس employee فراخوانی کنیم. کد زیر یک مثال بسیار خوب برای فهم بیشتر این مبحث است:

<?phpinclude("class_lib.php"); ?>
	<?php
		// Using our PHP objects in our PHP pages. 
		$mohammad = new person("mohammad safari");
		echo "mohammad's full name: " . $mohammad->get_name();
 
		$ali = new employee("ali safari");
		echo "---> " . $ali->get_name();
	?>

در مثال بالا روش استفاده‌ی مجدد از کدهای نوشته شده با ساختار OOP را مشاهده می‌کنید. یعنی شما دیگر نیازی به نوشتن مجدد برخی از متدها نخواهید داشت و می‌توانید از متدهای کلاس پایه یا والد، بهره ببرید. این روش باعث می‌شود تا کد نوشته‌ شده‌ی شما به اصطلاح ماژولار شده و قابلیت توسعه و پیشرفت دادن آن بیشتر شود. همچنین ساختار کدها منسجم‌تر شده و نیاز به نوشتن کد کمتری خواهید داشت.

مرحله‌ی بیست‌ویک:

اووِر راید کردن متدها

برخی مواقع هنگام استفاده از ویژگی ارث‌بری، ممکن است نیاز به تغییر برخی از توابع کلاس پایه داشته باشید. به عنوان مثال، اجازه دهید متد ()set_name در کلاس employee را تغییر دهیم به نحوی که این متد در این کلاس نسبت کلاس person تغییر یابد. در این شرایط شما با تعریف کردن متدی مشابه در کلاس employee، در واقع نسخه‌هایی از متد ()set_name را از کلاس person، اووِر راید کرده‌اید. به کد زیر توجه کنید:

<?php
	class person 
	{
		protected function set_name($new_name) {
			if ($new_name != "Mohammad Two") {
				$this->name = strtoupper($new_name);
			}
		}
	} 
 
	class employee extends person 
	{
		protected function set_name($new_name) {
			if ($new_name == "mohammad safari") {
				$this->name = $new_name;
			}
		}
	}
?>

توجه داشته باشید که متد ()set_name اکنون و پس از تغییرات بالا در کلاس جدید employee با همین متد در کلاس پایه با همان person تفاوت دارد.

مرحله‌ی بیست‌ودوم:

گاهی ممکن است نیاز داشته باشید تا به نسخه‌ی اصلی متدی در کلاس پایه دسترسی داشته باشید که آن را در کلاس جدید اوور راید کرده‌اید. در مثال ما، متد ()set_name در کلاس employee اوور راید شده است. حالا قصد داریم از کد زیر استفاده کنیم:

person::set_name($new_name);

به منظور دسترسی به نسخه‌ی اصلی متد ()set_name که در کلاس والد (person) وجود دارد، باید از کدی شبیه به زیر استفاده کنیم:

<?php
	class person 
	{
		// explicitly adding class properties are optional - but 
		// is good practice
		var $name;	 
		function __construct($persons_name) {
			$this->name = $persons_name;
		 }
 
		 public function get_name() {
		 	return $this->name;
		 }
 
		 // protected methods and properties restrict access to 
		 // those elements.
		 protected function set_name($new_name) {
		 	 if ($this->name !=  "Mohammad Two") {
		 	 	$this->name = strtoupper($new_name);
		 	 } 
		}
	} 
 
	// 'extends' is the keyword that enables inheritance
	class employee extends person 
	{
		protected function set_name($new_name) {
		if ($new_name ==  "Stefan Sucks") {
			$this->name = $new_name;
		}
	 	else if ($new_name ==  "Johnny Fingers") {
			person::set_name($new_name);
		} 
	}
 
	function __construct($employee_name) 
	{
		$this->set_name($employee_name);
	}
}
?>

 استفاده از سیمبل‌ها (symbol)

استفاده از :: برای تشخیص نام کلاسی که قصد داریم از متدهای داخلی آن استفاده کنیم به کار می‌رود. به مثال زیر توجه کنید تا این مبحث را بیشتر توضیح دهیم:

'person::set_name()'

کد بالا به پی‌اچ‌پی می‌گوید که به دنبال متد ()set_name در کلاس person بگردد. علاوه بر این یک راه میانبر دیگر برای اشاره به کلاس والد کلاس کنونی وجود دارد. این راه میانبر در واقع استفاده از کلمه‌ی کلیدی parent است. به کد نمونه‌ی زیر توجه کنید:

protected function set_name($new_name) 
{	
	if ($new_name ==  "mohammad safari") {
		$this->name = $new_name;	
	 }	
	 else if ($new_name ==  "ali safari") {
		parent::set_name($new_name);	
	}	
}

 

آموزش کامل PHP – قسمت 30: شئ گرایی 3

در ادامه جلسه قبل در این قسمت نیز به شئ گرایی در php می پردازیم.

مرحله دوازدهم:

دسترسی مستقیم به پروپرتی‌ها (که توصیه نمی‌شود)

برای دسترسی مستقیم به خواص اشیاء ساخته شده در پی‌اچ‌پی، نیازی به استفاده از متدها ندارید. شما می‌توانید به طور مستقیم با استفاده از عملگر <- و نام متغیر (پروپرتی) مورد نظر، به آن دسترسی داشته باشید. به عنوان مثال اگر در کلاس پی‌اچ‌پی نوشته شده‌ی خود، یک پروپرتی به نام name$ (در شیء mohammad$) داشته باشید، برای دسترسی به مقدار این متغیر باید از کدی مثل زیر استفاده کنید:

$name = $mohammad->name;

البته همانطور که اشاره کردیم، استفاده از این روش پیشنهاد نمی‌شود چراکه امکان دارد در ادامه مسیر، با مشکلاتی مواجه شوید. برای دسترسی به مقادیر متغیرها (پروپرتی‌ها) در یک کلاس پی‌اچ‌پی، بهتر است از متدهای دریافت‌کننده یا getter استفاده کنید. برای درک بیشتر به کد زیر توجه کنید:

<?php include("class_lib.php"); ?>		
<?php 
	$mohammad = new person();		
	$reza = new person();
 
	$mojtaba->set_name("mohammad safari");
	$reza->set_name("reza safari");	
 
	// دسترسی مستقیم به مقدار یک پروپرتی در کلاس که پیشنهاد نمی شود
	echo "mohammad's full name: ".$mohammad->name;
?>

مرحله سیزدهم:

سازنده ها (constructor)

در تمامی کلاس‌های پی‌اچ‌پی می‌توان متدهایی موسوم به کانستراکتور را تعریف کرد که در واقع یک متد داخلی آن کلاس محسوب می‌شود. کانستراکتورها به شما اجازه می‌دهند تا خواص مورد نظر کلاس خود را تعریف کنید. بدین وسیله به محض ساختن و فراخوانی چنین کلاسی، متد کانستراکتور آن کلاس به صورت خودکار اجرا خواهد شد.

نکته: اگر تابعی به نام ()constructــ در کلاس مورد نظرتان بسازید، پی‌اچ‌پی به طور خودکار متد (تابع) ()constructــ را پس از ساختن هر شیء و در واقع پس از اجرای کلاس، فراخوانی می‌کند.

به یاد داشته باشید که برای تعریف کانستراکتور در ابتدای نام آن باید دو علامت آندراسکور (آندرلاین ــ) قرار دهید و بدون هیچ فاصله‌ یا کاراکتر اضافه‌ای، کلمه‌ی construct را در ادامه‌ی نام آن بنویسید. برای درک بیشتر موضوع، به کد زیر توجه کنید:

<?php 		
	class person {
		var $name;
		function __construct($persons_name) {		
			$this->name = $persons_name;		
		}		
 
		function set_name($new_name) {
		 	 $this->name = $new_name;
		}	
 
		function get_name() {		
		 	 return $this->name;		
		 }		
 
	}	 	
?>

از حالا به بعد به منظور پیش‌برد راحت‌تر و یکپارچه‌تر مبحث شی‌ءگرایی در پی‌اچ‌پی، هر جا صحبت از متد شد منظور ما تابع داخل کلاس و هرجا از پروپرتی‌ها سخن گفتیم، منظور ما همان متغیرهای کلاس هستند.

مرحله چهاردهم:

ساختن یک کلاس (شیء) مجهز به کانستراکتور

حالا که ما با نحوه‌ی ساختن کانستراکتور آشنا شده‌ایم، می‌توانیم برای ساخت کلاس person، مقداری را به عنوان پیش‌فرض برای پروپرتی name$ مشخص کنیم. شما می‌توانید ورودی‌های مختلفی را به صورت آرگومان‌، برای متد کانستراکتور تعیین کنید. اگر با این موضوع آشنایی ندارید بد نیست سری به بخش آموزش توابع در پی‌اچ‌پی بزنید که پیش‌تر آن را در سایت منتشر کرده‌ایم. برای افزودن ورودی به کانستراکتور، باید پس از استفاده از یک شیء ورودی‌ها را در داخل پرانتز و پس از نام کلاس مورد نظر، وارد کنیم. به عنوان مثال به کد زیر توجه کنید:

$mohammad = new person("mohammad safari");

استفاده از کانستراکتور و مقدار دهی ورودی مورد نیاز آن باعث شد تا دیگر نیازی به فراخوانی متد ()set_name نداشته باشیم که همین کار باعث می‌شود با نوشتن کد کمتر، بتوان پروژه‌های مسنجم‌تری را ساخت. استفاده از کانستراکتورها همانند سایر زبان‌ها نظیر جاوا و … در بین برنامه‌نویسان این زبان، رایج است. باز هم توجه شما را به مثال زیر جلب می‌کنیم:

<?php include("class_lib.php"); ?>		
<?php 
	$mohammad = new person("mohammad safari");
	echo "mohammad's full name: ".$mohammad->get_name();
?>

استفاده از مکانسیم شی‌ءگرایی در مثال بالا، یکی از کاربردهای بسیار ساده‌ای است که می‌تواند در زمان و انرژی شما در کدنویسی صرفه‌جویی قابل توجهی کند.

مرحله پانزدهم:

محدود کردن دسترسی به پروپرتی‌ها با اصلاح‌کننده‌های دسترسی

یکی از اصول بنیادی در برنامه‌نویسی شیءگرا، کپسوله‌سازی (encapsulation) است. اگر قصد دارید تا دسترسی به پروپرتی‌های مختلف را در کلاس خود محدود کنید، این ایده به شما کمک می‌کند تا کد خوانا‌تر و بهتری را تولید کنید.

برای محدود کردن دسترسی به پروپرتی‌های کلاس خود، باید از اصلاح‌کننده‌های دسترسی (ٰaccess modifiers) استفاده کنید. در پی‌اچ‌پی نیز مثل بسیاری از زبان‌های خانواده‌ی سی، ۳ عدد اصلاح‌کننده دسترسی موجود است:

  1. public (عمومی)
  2. private (خصوصی)
  3. protected (محافظ شده)

اصلاح‌کننده‌ی پیش‌فرض برای هر پروپرتی در هر کلاس در پی‌اچ‌پی، Public است. به مثال زیر توجه کنید:

<?php 		
	class person {		
	var $name;		
		public $height;		
		protected $social_insurance;
		private $pinn_number;
 
		function __construct($persons_name) {		
			$this->name = $persons_name;		
		}		
 
		function set_name($new_name) {   	
			$this->name = $new_name;
		}	
 
		function get_name() {
			return $this->name;
		}		
 
	}
?>

نکته: زمانی که شما یک پروپرتی را با استفاده از کلمه‌ی کلیدی var تعریف کنید، آن پروپرتی به صور پیش‌فرض عمومی (Public) خواهد بود.

مرحله شانزدهم:

محدود کردن دسترسی به پروپرتی‌ها: بخش دوم

هنگامی که یک پروپرتی را در کلاس‌های پی‌اچ‌پی از نوع private تعیین کنیم، فقط برخی از کلاس‌های دیگر می‌توانند به مقدار این پروپرتی دسترسی داشته باشند.

هنگامی که یک پروپرتی را در کلاس‌های پی‌اچ‌پی از نوع protected تعیین کنیم، فقط برخی از کلاس‌های مشتق شده از کلاس مورد نظر، امکان دسترسی به پروپرتی‌ یاد شده را خواهند داشت. مشتق شدن و مباحث مربوط به ارث‌بری در کلاس‌های پی‌اچ‌پی را بعدا به شما آموزش خواهیم داد.

پروپرتی‌هایی که به صورت Public تعریف شده‌ باشند، محدودیت دسترسی نداشته و این یعنی هر کسی و هر کلاسی می‌تواند به مقدار آن‌ها دسترسی یابد.

به منظور فهم بیشتر این بخش تقریبا فرار از شیءگرایی در پی‌اچ‌پی، کد زیر را به دقت مشاهده کرده و آن را خودتان نیز تمرین، تا نتیجه را مشاهده کنید. برای درک بهتر کدها، کامنت‌های موجود در مثال زیر را نیز مطالعه کنید:

<?php include("class_lib.php"); ?>
<?php  
	$stefan = new person("Stefan Mischook");   
	echo "Stefan's full name: " .  $stefan->get_name() ;  
 
	/*  
	Since $pinn_number was declared private, this line of code 
	will generate an error. Try it out!   
	*/  
 
	echo "Tell me private stuff: ".$stefan->pinn_number;  
?>

نکته: اگر بخواهید از طریق یک کلاس دیگر به یک پروپرتی خصوصی (private) در یک کلاس دیگر دسترسی داشته باشید، با خطای PHP مواجه خواهید شد. این خطا چیزی شبیه به متن زیر خواهد بود:

'Fatal error: Cannot access private property person::$pinn_number in ...'

مرحله هفدهم:

محدود کردن دسترسی به متدها

درست همانند پروپرتی‌ها، شما می‌توانید دسترسی به متدهای تعریف شده در یک کلاس را با استفاده از ۳ اصلاح‌کننده زیر کنترل کنید.

  1. public (عمومی)
  2. protected (محافظت شده)
  3. private (خصوصی)

به طور خلاصه: امکان کنترل کردن دسترسی به متدهای هر کلاس، باعث می‌شود تا بتوانیم روش استفاده‌ی دیگران از آن کلاس را کنترل کنیم.

احتمالا شما هم متوجه شده‌اید که استفاده از محدودکننده‌های دسترسی و دیگر ساختارهای برنامه‌نویسی شیءگرا، کمی زیرکانه خواهد بود. این مورد برای افرادی که به تازگی شروع به یادگیری شیءگرایی کرده‌اند، بیشتر محسوس است. پس بهتر است شما نیز به خود شانسی بدهید و شروع به یادگیری و استفاده از این روش کنید.

با توجه به آنچه اشاره شد، باید بگوییم که ساختار یکپارچه‌ی برنامه نویسی شیءگرا باعث می‌شود تا بتوان روی پروژه‌های موجود که با این روش ساخته شده‌اند کار کرد یا پروژه‌های گروهی را به طور استانداردتر پیش برد. به کد زیر توجه کنید:

<?php 
	class person {  
		var $name;  
 
		public $height;  
		protected $social_insurance;  
		private $pinn_number;
 
		function __construct($persons_name){   
		   $this->name = $persons_name;  
		}       
 
		private function get_pinn_number(){
			return
			$this->pinn_number;  
		}       
	}   
?>

نکته: از آنجا که متد ()get_pinn_number یک متد از نوع خصوصی (private) است، تنها جایی که می‌توان از این متد استفاده کرد، در همین کلاس است. اگر قصد دارید متدهای مورد نظر خود را در صفحات پی‌اچ‌پی خود به طور مستقیم فراخوانی کنید، مسلما باید آن متدها را به صورت عمومی یا همان Public تعریف کرده باشید.

آموزش کامل PHP – قسمت 29: شئ گرایی 2

در این جلسه به ادامه مبحث شئ گرایی در php می پردازیم.

مرحله ششم:

به کد زیر توجه کنید:

$this->name = $new_name;

this$ یک متغیر درونی است که به شئ کنونی کلاس مورد نظر اشاره دارد. به عبارت دیگر این یک متغیر ارجاع داخلی است. از این طریق اقدام به صدا زدن همان تابع یا متد درونی کلاس می کنیم. حال به کد زیر توجه کنید:

function get_name() {
	return $this->name;
}

this را مانند یک کلمه کلیدی در نظر بگیرید که به یک متد جاری اشاره می کند.

مرحله هفتم:

استفاده از کلاس در صفحه اصلی index.php

شما نباید هیچگاه در فایل‌های اصلی پروژه‌های خود، به صورت مستقیم اقدام به ساختن کلاس‌های مورد نظر کنید. اگر کلاس‌ها را به طور مستقیم در فایل‌های اصلی پروژه تعریف کنید این کار باعث می‌شود تا از هدف اصلی شیءگرایی دور شوید. بهترین کار این است که همیشه برای هر کلاس یک فایل جداگانه php ایجاد کنید. برای استفاده از یک کلاس در سایر فایل‌های پی‌اچ‌پی، همانطور که در جلسات قبلی اشاره کردیم، می‌توانید از دستورات include یا require بهره ببرید.

به کد زیر توجه کنید:

<?php include("class_lib.php"); ?>

توجه داشته باشید که تا به این لحظه هنوز در کلاس خود هیچ چیز نداریم و در ادامه متدها و پروپرتی‌های مورد نظرمان را ایجاد خواهیم کرد.

مرحله هشتم:

معرفی و ساخت اشیاء

کلاس‌ها نقشه‌های کلی یا قالب‌های کلی برای اشیاء در پی‌اچ‌پی هستند. تا زمانی که شما instantiation (نمونه سازی) را انجام ندهید، در واقع کلاس‌های پی‌اچ‌پی به اشیاء مبدل نخواهند شد. هنگامی که شما یک کلاس را نمونه‌سازی کنید، در حقیقت یک نمونه از آن را تولید کرده‌اید و بنابراین می‌توان در این شرایط اقدام به ساخت اشیاء کرد. به عبارت دیگر، نمونه‌سازی را می‌توان فرآیند ساخت یک نمونه از یک شیء در حافظه تعریف کرد. اما کدام حافظه؟ منظور ما در اینجا، البته حافظه سرور است. به کد زیر دقت کنید:

<?php include("class_lib.php"); ?>
<?php 
	$mohammad = new person();
?>

متغیر mohammad$ در کد بالا یک مرجع برای شیء تازه ساخته شده‌ی person خواهد بود. در اینجا گفتیم که متغیر mohammad$ یک مرجع است چراکه ما از همین مرجع به منظور کنترل و استفاده از اشیاء کلاس person بهره خواهیم برد. اگر شما کد بالا را اجرا کنید، هیچ چیزی را در صفحه مشاهده نخواهید کرد. دلیل این امر این است که ما هنوز به پی‌اچ‌پی نگفته‌ایم که چه کاری با شیء تازه ساخته شده‌ انجام دهد.

مرحله نهم:

کلمه کلیدی new

ه منظور ساختن یک شیء خارج از یک کلاس، شما باید از کلمه کلیدی new استفاده کنید. برای ساختن و نمونه‌سازی یک کلاس، می‌توانید به صورت اختیاری، به نام کلاس کاراکترهای پرانتز را اضافه کنید. در مثال زیر ما دو شئ مشابه از یک کلاس ایجاد کردیم:

<?php include("class_lib.php"); ?>
<?php 
	$ali = new person();
	$mohammad = new person;
?>

هنگام ساختن یک شیء، اطمینان حاصل کنید که نام آن کلاس را بین علامت ‘ ‘ قرار ندهید.

مرحله دهم:

ست کردن خواص اشیاء

حال که دو شئ مجزا از کلاس ایجاد کردیم، می‌توانیم پروپرتی‌های آن‌ها را نیز با استفاده از متدهای داخلی کلاس، تنظیم کنیم. دقت کنید که هر دو شئ از یک کلاس مشابه ساخته شده‌اند اما با این وجود پی‌اچ‌پی این دو را به عنوان دو شیء متفاوت می‌شناسد. به کد زیر توجه کنید:

<?php include("class_lib.php"); ?>
<?php 
	$ali = new person();
	$mohammad = new person;
	$ali->set_name("ali safari");
	$mohammad->set_name("mohammad safari");
?>

مرحله یازدهم:

دسترسی به داده های شئ

برای دسترسی به داده هایی که در شئ داریم از متد دریافت کننده get استفاده می کنیم. هنگام دسترسی به متدها و پروپرتی‌های یک کلاس باید از عملگر <- استفاده کنیم. به کد زیر توجه کنید:

<?php include("class_lib.php"); ?>
<?php 
	$ali = new person();
	$mohammad = new person;
 
	$ali->set_name("ali safari");
	$mohammad->set_name("mohammad safari");
 
	echo "ali's full name: " . $ali->get_name();
	echo "mohammad's full name: " . $mohammad->get_name(); 
?>

توجه داشته باشید که عملگر <- در اینجا به عملگر <- در آرایه‌ها شباهتی ندارد.

آموزش کامل PHP – قسمت 28: شیء گرایی 1

در ادامه آموزش های php با پردیس وردپرس در این جلسه به مباحث شیء گرایی در php می پردازیم. از این جلسه به بعد وارد مباحث پیشرفته تر برنامه نویسی php می شویم و آموزش ها را مانند جلسات قبل همراه با مثال و به سادگی پیش می بریم. در زیر خلاصه ای از آنچه که یاد خواهید گرفت را آورده ایم:

  • تفاوت بین ساخت یک اپلیکیشن پی‌اچ‌پی با روش معمولی و روش شی‌ءگرا (OOP).
  • اصول OOP چه هستند و چگونه از آن‌ها در پی‌اچ‌پی استفاده کنیم.
  • چه زمانی از OOP در اسکریپت‌های پی‌اچ‌پی خود استفاده کنیم.

شیء گرایی در php

برای یادگیری بهتر مبحث OOP باید با مباحث پیش‌نیاز از جمله، توابع، متغیرها، دستورات شرطی و حلقه‌ها که در جلسات قبلی گفته شد آشنایی داشته باشید. برای یادگیری بهتر و ساده تر ما شیء گرایی را به صورت مرحله به مرحله و در طی چند جلسه آموزش خواهیم داد.

مرحله اول:

مثل همیشه نرم افزار xampp یا wamp خود را باز کرده و در پوشه اصلی (htdocs در xampp و www در wamp) یک پوشه جدید بسازید و در آن فایل های index.php و class.php را ایجاد کنید. شیء گرایی در واقع استفاده از مفهوم کلاس در برنامه نویسی است. کلاس قالب کلی برای تعریف اشیاء است.

مرحله دوم:

کد های کلاس خود را در فایل class.php قرار می دهیم. برای تعریف کلاس از کلمه کلیدی class همراه با نام کلاس استفاده می کنیم و محتوای کلاس را مانند متد ها یا توابع در آکولاد باز و بسته قرار می دهیم.

<?php 
	class person {
 
	}
?>

از تفاوت های کلاس با توابع این است که محتوای کلاس می تواند متغیر ها یا توابع جداگانه ای باشد. هر یک از توابع موجود در کلاس را یک شیء (object) می نامند. داده ها یا متغیرها را نیز ویژگی یا خاصیت می گویند.

مرحله سوم:

افزودن متغیر

<?php 
	class person {
		var $name;
	}
?>

از متدها یا توابع یک کلاس به منظور اعمال تغییرات در داده‌ها و خواص (متغیرهای کلاس) استفاده می‌کنیم. توجه داشته باشید که در یک کلاس، متغیرها را Property (مشخصه‌ها یا ویژگی‌ها) می‌نامند و توابع نیز متدهای کلاس خوانده می‌شوند.

مرحله چهارم:

افزودن توابع یا متد ها

<?php 
	class person {
		var $name;
		function set_name($new_name) {
			$this->name = $new_name;
		}
		function get_name() {
			return $this->name;
		}
	}
?>

مرحله پنجم:

در مرحله قبل توابع set و get را به کلاس خود اضافه کردیم که جزء رایج شیء گرایی می باشند و در تمامی زبان های شیء گرا مانند جاوا و ++C نیز به همین شکل وجود دارند. بهتر است نام گذاری این توابع با نام متغیری که قصد تغییر آن را داریم یکسان باشد.

آموزش کامل PHP – قسمت 27: توابع رشته ای

کار با رشته ها در php

تابع ()strpos

این تابع برای بدست آوردن جایگاه خاصی از یک رشته متنی به کار می رود. این تابع به عنوان ورودی یک رشته متنی را در آرگومان اول دریافت کرده و بخشی که قصد بیرون آوردن آن از رشته متنی داریم را در آرگومان دوم دریافت می کند. یعنی در واقع محل آرگومان دوم را در رشته متنی یا آرگومان ورودی اول جستجو می کند. خروجی تابع آدرس یا محل وقوع ورودی یا آرگومان دوم در رشته مورد نظر است. اگر موردی یافت نشود تابع مقدار false را بر می گرداند. مثال:

$numberedString = "123456789"; // 9 numbers from 1 to 9

$fivePos = strpos($numberedString, "5");
echo $fivePos;

خروجی مثال فوق عدد 4 است که در متغییر fivepos قرار می گیرد.

تابع ()str_replace

کارکرد این تابع مانند دستور replace در نرم افزار های واژه پرداز مانند ورد است. با استفاده از این تابع می توانیم مواردی را در رشته های متنی جایگذاری کنیم. پارامترهای ورودی این تابع 3 مورد هستند:

  1. Search: این ورودی همان چیزی است ک قصد دارید در رشته متنی به دنبال آن بگردید. این ورودی می‌تواند یک رشته‌متنی یا یک آرایه باشد.
  2. replace: تمام یافته‌های حاصل از جستجوی رشته‌های متنی با این ورودی جایگزین می‌شوند. این ورودی در واقع مقدار جدیدی است که قصد دارید آن را با مقادیر قدیمی مورد نظر جایگزین کنید.
  3. orginalString: رشته متنی اولیه که قصد دارید در آن به جستجو و جایگزین کردن رشته‌های جدید بپردازید.

برای درک بهتر این تابع به مثال زیر توجه کنید:

<?php
//string that needs to be customized
$first= "Welcome to pardiswp";

$sec= str_replace("pardiswp", "@mxsafari", $first);

echo $sec;
?>

در خروجی کد فوق کلمه pardiswp با mxsafari@ در رشته ورودی جاگزین می شود.

تابع ()trim

گاهی ورودی‌هایی که کاربر وارد می‌کند را باید فیلتر کنیم که در جلسه قبل با توابع مرتبط با آن آشنا شدیم. اما با استفاده از تابع trim می‌توانید ابتدا کاراکترهای خالی (فاصله) سمت چپ و سمت راست رشته متنی را حذف کرده و سپس مقدار نهایی را در خروجی قرار دهید. این تابع یک ورودی دارد که آن رشته‌ی متنی مورد نظر است که قصد حذف کاراکترهای خالی سمت چپ و راست آن را داریم. مثال:

<?php
//string that needs to be trimmed
$stringTest = "  test trim func   ";
$finalString = trim($stringTest);
echo $finalString;
?>

نتیجه رشته‌ متنی بدون فاصله‌های اضافه اول و آخر آن خواهد بود.

از تابع ()ltrim و ()rtrim هم می‌توانید به صورت مشابه و به ترتیب برای حذف کاراکترهای خالی سمت چپ و حذف کاراکترهای سمت راست بهره ببرید.

تابع ()md5

با استفاده از این تابع می‌توانید یک رشته متنی را بدون بازگشت به صورت کدشده در بیاورید. از این تابع در پی‌اچ‌پی استفاده های فراوانی می‌شود. به عنوان مثال پیش از ذخیره رمزهای عبور یا اطلاعات مهم دیگر بسیاری از برنامه‌نویسان آن‌ها را با تابع md5 به صورت رمزنگاری شده در می‌آورند و سپس آن را در بانک‌های اطلاعاتی ذخیره می‌کنند. بدین ترتیب امنیت بیشتری در پروژه نوشته شده با PHP به وجود می آید. مثال:

<?php
//string that needs to encrypted
$str = "pardiswp";
$finalStr = md5($str);
echo $finalStr;
?>

همانطور که می‌بینید این تابع فقط یک ورودی دارد و آن هم رشته متنی‌ است که قصد دارید آن را رمزنگاری کنید. خروجی کد فوق رشته متنی رمز شده در مرورگر کاربر خواهد بود.

تابع ()str_word_count

از این تابع به منظور شمارش تعداد کلمات موجود در یک رشته متنی استفاده می‌شود. این تابع سه ورودی دارد که ورودی اول ضروری و ورودی دوم و سوم اختیاری هستند و می‌توان آن‌ها را در تابع وارد نکرد.

  1. string: رشته متنی‌ که قصد دارید تعداد کلمات آن را شمارش کنید.
  2. return: این ورودی اختیاری است. می‌توان سه مقدار برای آن تعیین کرد. اگر این ورودی ۰ باشد، خروجی تابع همان تعداد کلمات رشته متنی است که به صورت پیش فرض اگر وارد نشود هم همان صفر در نظر گرفته می‌شود. اگر این آرگومان ۱ باشد، خروجی تابع یک آرایه از تمام کلمات رشته متنی مورد نظر خواهد بود. اگر این آرگومان ۲ باشد خروجی تابع آرایه‌ای از کلمات خواهد بود با این تفاوت که این بار کلید هر عضو از آرایه در واقع جایگاه آن در رشته متنی خواهد بود.
  3. char: این آرگومان نیز اختیاری است. می‌توان با این ورودی برخی کاراکترهای خاص را به عنوان کلمه در نظر گرفت.

برای آشنایی بیشتر با این تابع به مثال زیر دقت کنید:

<?php
$str = "pardiswp website";
$finalStr = str_word_count($str);
echo $finalStr;
?>

نتیجه اجرای کد فوق عدد ۲ خواهد بود.

تابع ()strlen

با استفاده از این تابع می‌توانید تعداد کاراکترهای یک رشته متنی را شمارش کنید. این تابع فقط یک ورودی دارد و آن هم رشته متنی مورد نظری است که قصد دارید طول آن را بدست آورید. مثال:

<?php
$str = "pardiswp website";
$finalStr = strlen($str);
echo $finalStr;
?>

نتیجه اجرای کد فوق عدد ۱۴ خواهد بود. چراکه رشته متنی ذخیره شده در متغیر str در کد بالا، شامل ۱۴ کاراکتر است. دقت کنید که فاصله هم به عنوان یک کاراکتر شناخته می‌شود.

تابع ()substr

از این تابع به منظور برش دادن بخش خاصی از یک رشته متنی می‌توان استفاده کرد. خروجی این تابع بخش مورد نظر شما خواهد بود. این تابع سه ورودی دارد.

  1. string: رشته متنی‌ که قصد دارید بخشی از آن را برش دهید.
  2. start: جایگاهی که قصد دارید از آنجا عمل برش رشته متنی انجام شود. این عدد در واقع شماره جایگاه کاراکتر اولیه‌ای است که قصد دارید برش را از آنجا آغاز کنید. اگر این مقدار ۰ باشد، عملیات برش از اولین کاراکتر شروع می‌شود.
  3. length: این ورودی در واقع اختیاری بوده و می‌توانید آن را وارد نکنید. این ورودی طول رشته متنی برش خورده نهایی را بر حسب کاراکتر نشان می‌دهد. به صورت پیش فرض اگر این آرگومان را وارد نکنید رشته متنی تا آخرین کاراکتر برش خواهد خورد.

برای درک بهتر این تابع توجه شما را به مثال زیر جلب می‌کنیم:

<!DOCTYPE html>

<html>

<body>

<?php

// Positive numbers:

echo substr("Hello world",10)."<br>";

echo substr("Hello world",1)."<br>";

echo substr("Hello world",3)."<br>";

echo substr("Hello world",7)."<br>";

echo "<br>";

// Negative numbers:

echo substr("Hello world",-1)."<br>";

echo substr("Hello world",-10)."<br>";

echo substr("Hello world",-8)."<br>";

echo substr("Hello world",-4)."<br>";

?>

</body>

</html>

خروجی کد بالا به صورت زیر خواهد بود:

d

ello world

lo world

orld

d

ello world

lo world

orld

بدین صورت با این تابع می‌‌توانید بخش مورد نظر خود را از هر رشته‌ متنی برش دهید.

آموزش کامل PHP – قسمت 26: فیلتر ها

فیلتر ها در php

در این قسمت از آموزش های php با فیلتر های این زبان به منظور اعتبارسنجی و پاکسازی داده‌های ورودی آشنا خواهیم شد. ممکن است برخی از داده‌های ورودی مشکلات و مسائل امنیتی مهمی را در صفحات وب شما ایجاد کنند. در این شرایط فیلترهای پی‌اچ‌پی می‌توانند به منظور اعتبارسنجی داده ها مورد استفاده قرار گیرند. فیلترهای پی‌اچ‌پی شامل توابع بسیاری برای بررسی ورودی‌های کاربر بوده و طراحی شده تا داده‌ها را به روشی آسان‌تر و سریع‌ تر اعتبارسنجی کند.

تابع ()filter_list

به کمک این تابع می توانیم تمامی فیلتر هایی که در php ارائه می شود را لیست کنیم. برای استفاده از تابع سرور مجازی خود را اجرا کرده و در پوشه اصلی آن پوشه ای دیگر ایجاد کنید و فایلی به نام phpfilter.php بسازید. سپس کد های زیر را در آن قرار دهید:

<!DOCTYPE html>

<html>

<head>

<style>

table, th, td {

    border: 1px solid black;

    border-collapse: collapse;

}

th, td {

    padding: 5px;

}

</style>

</head>

<body>

<table>

  <tr>

    <td>Filter Name</td>

    <td>Filter ID</td>

  </tr>

  <?php

  foreach (filter_list() as $id =>$filter) {

      echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) .'</td></tr>';

  }

  ?>

</table>

</body>

</html>

نتیجه اجرای کد زیر چیزی شبیه جدول زیر خواهد شد:

Filter Name Filter ID
int 257
boolean 258
float 259
validate_regexp 272
validate_url 273
validate_email 274
validate_ip 275
string 513
stripped 513
encoded 514
special_chars 515
full_special_chars 522
unsafe_raw 516
email 517
url 518
number_int 519
number_float 520
magic_quotes 521
callback 1024

همانطور که در جدول بالا مشاهده می‌کنید تمامی فیلترهایی که پی‌اچ‌پی ارائه می‌کند لیست شده‌اند.

تابع ()filter_var

این تابع می تواند دو عملیات اعتبار سنجی و بهینه سازی داده ها را انجام دهد. تابع دو ورودی می‌گیرد، یکی داده‌ای که قصد داریم آن را اعتبارسنجی و پاکسازی کنیم و دیگری نوع فیلتری که قصد استفاده از آن را داریم.

بهینه‌سازی یک رشته متنی

در مثال زیر از تابع ()filter_var به منظور حذف تگ‌های اچ‌تی‌ام‌ال از رشته متنی استفاده شده است:

<?php

$str = "<h1>Hello World!</h1>";

$newstr = filter_var($str, FILTER_SANITIZE_STRING);

echo $newstr;

?>

همانطور که می‌بینید تگ‌های HTML از این رشته متنی حذف شده است. در مثال بالا ابتدا متغیر str را به عنوان ورودی تعیین کرده و پس از قرار دادن یک کاما، نوع فیلتر مورد نظر خود را به عنوان ورودی دوم تعیین می‌کنیم. با استفاده از فیلتر FILTER_SANITIZE_STRING می‌توان تگ‌های اچ‌تی‌ام‌ال اضافه را از رشته‌های متنی حذف کرد.

اعتبارسنجی عدد

در مثال زیر با استفاده از ()filter_var قصد داریم تا متغیری از نوع عددی را بررسی کنیم. اگر متغیر ما واقعا عدد صحیح باشد خروجی ما عبارت Integer is valid خواهد بود. اگر این متغیر عددی نباشد خروجی عبارت Integer is not valid است.

<?php

$int = 100;

if (!filter_var($int, FILTER_VALIDATE_INT) === false) {

    echo("Integer is valid");

} else {

    echo("Integer is not valid");

}

?>

همانطور که در مثال بالا هم می‌بینید ورودی اول متغیر int بوده و در شرط فیلتر بررسی عددی یعنی FILTER_VALIDATE_INT قرار داده شده است.

نکته‌ای در هنگام کار با تابع ()filter_var در مورد عدد صفر وجود دارد. اگر در مثال بالا مقدار متغیر int برابر با صفر باشد خروجی تابع Integer is not valid می‌شود. برای حل این مشکل باید از کدی مانند زیر استفاده کنیم:

<?php

$int = 0;

if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) {

    echo("Integer is valid");

} else {

    echo("Integer is not valid");

}

?>

نتیجه اجرای کد بالا به صورت زیر خواهد بود:

Integer is valid

اعتبارسنجی آی‌پی

در مثال زیر با استفاده از تابع ()filter_var قصد داریم تا محتوای متغیر ip را بررسی کنیم که آیا این متغیر حاوی یک آی‌پی معتبر است یا خیر:

<?php

$ip = "127.0.0.1";

if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {

    echo("$ip is a valid IP address");

} else {

    echo("$ip is not a valid IP address");

}

?>

نتیجه اجرای کد بالا به صورت زیر خواهد بود:

127.0.0.1 is a valid IP address

اعتبارسنجی ایمیل

در مثال زیر با استفاده از تابع ()filter_var قصد دارید تا تمام کاراکترهای غیرقانونی را از متغیر email حذف کرده و سپس بررسی کنیم که آیا فرمت ایمیل صحیح است یا خیر:

<?php

$email = "pardiswp@gmail.com";

// Remove all illegal characters from email

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate e-mail

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {

    echo("$email is a valid email address");

} else {

    echo("$email is not a valid email address");

}

?>

نتیجه اجرای کد فوق به صورت زیر خواهد بود:

pardiswp@gmailcom is a valid email address

همانطور که می‌بینید ابتدا با تابع فیلتر پی‌اچ‌پی و فیلتر FILTER_SANITIZE_EMAIL قصد داریم تا متغیر email را از نظر کاراکترهای غیرقانونی بررسی کرده و سپس کاراکترهای اضافه را از آن حذف کنیم. سپس با فیلتر FILTER_VALIDATE_EMAIL و یک عبارت شرطی صحیح بودن فرمت کلی ایمیل را بررسی کرده‌ایم.

اعتبارسنجی آدرس URL

در مثال زیر با استفاده از تابع ()filter_var ابتدا تمامی کاراکترهای غیرقانونی را از آدرس URL حذف کرده و سپس آن را بررسی می‌کنیم تا ببینیم یک URL معتبر است یا خیر:

<?php

$url = "http://www.pardiswp.com";

// Remove all illegal characters from a url

$url = filter_var($url, FILTER_SANITIZE_URL);

// Validate url

if (!filter_var($url, FILTER_VALIDATE_URL) === false) {

    echo("$url is a valid URL");

} else {

    echo("$url is not a valid URL");

}

?>

نتیجه اجرای کد فوق نیز به صورت زیر خواهد بود:

http://www.pardiswp.com is a valid URL

در این جلسه بیشتر فیلترهای پرکاربرد پی‌اچ‌پی را مرور کردیم. در جلسه آینده فیلترهای پیشرفته‌تری را بررسی می‌کنیم.

آموزش کامل PHP – قسمت 25: تاریخ شمسی

تاریخ شمسی در php

تمام آنچه که در جلسه قبلی گفته شد فقط برای تاریخ‌های میلادی بکار می‌رود. برای استفاده از تاریخ شمسی باید از یک کلاس خارجی استفاده کنید. اینکه کلاس خارجی چیست فعلا کاری با آن نداریم. اگر به خاطر داشته باشید روش include کردن فایل‌ها را در جلسات گذشته مرور کردیم. شما باید فایل مربوط به کلاس تاریخ شمسی را به فایل مورد نظر خود که قصد استفاده از تاریخ شمسی را در آن دارید inlcude کرده و سپس به جای تابع date از jdate استفاده کنید. تمامی عملکرد‌های تابع jdate دقیقا شبیه به تابع date است.

ابتدا فایل jdf.php را از این لینک دانلود کنید و سپس فایل jdf.php را در کنار فایل مورد نظر خود به عنوان مثال در پوشه time که در پوشه htdocs یا www ساخته بودید قرار دهید. سپس در فایلی که قصد استفاده از تاریخ هجری شمسی را در آن دارید فایل jdf.php را include کنید.

به عنوان مثال به کد زیر دقت کنید:

<?php

include ("jdf.php");

print jdate("j of F Y, \a\\t g.i a", time());

?>

بالا ما فقط date را به jdate تغییر دادیم. در این صورت نتیجه اجرای کد فوق چیزی شبیه به زیر خواهد بود:

3 1396 بهار اردیبهشت 1396, at 10.14 ق.ظ

همانطور که می‌بینید فرمتی که برای نمایش تاریخ میلادی بود را بدون تغییر برای تاریخ هجری شمسی استفاده کردیم که زیاد جالب نیست. کد بالا را به شکل زیر تغییر دهید:

<?php

include ("jdf.php");

print jdate("j F Y - h:s", time());

?>

نتیجه کد بالا به شکل زیر خواهد بود:

3 اردیبهشت 1396 -10.19

قطعا فرمت بالا نسبت به فرمت قبلی برای کاربران فارسی زبان گویاتر است. لازم به ذکر است که در فایلی که در بالا لینک دانلود آن را قرار دادیم، راهنمای کامل تابع jdate نیز وجود دارد که از سایت رسمی سازنده آن منتشر شده و برای یادگیری عمیق‌تر این توابع jdf.php می‌توانید به راهنمای موجود در فایل دانلود شده یا وب‌سایت http://jdf.scr.ir مراجعه کنید.

آموزش کامل PHP – قسمت 24: کار با تاریخ و ساعت

کار با تاریخ و ساعت در php

در این جلسه از آموزش های php با پردیس وردپرس به کار با تاریخ و ساعت در پی‌اچ‌پی می پردازیم. مواقع زیادی در برنامه نویسی به کار کردن با تاریخ و ساعت احتیاج داریم. ابزار های زیادی برای این کار در php وجود دارد.

دریافت زمان با تابع ()time

این تابع تمام اطلاعات لازم برای زمان جاری را در اختیار شما قرار می دهد. تابع نیاز به هیچ آرگومان ورودی ندارد و یک رشته خروجی متنی دارد. رشته متنی که از این تابع برگردانده می‌شود تعداد ثانیه‌های سپری شده از نیمه شب ۱ ژانویه ۱۹۷۰ را به وقت GMT نشان می‌دهد. زمان حاضر به شکل UNIX نمایش داده می شود که این به معنی تعداد ثانیه‌های گذشته شده از یک زمان مرجع می باشد.

برای استفاده از این تابع یک فایل جدید در پوشه اصلی سرور مجازی خود بسازید و کد زیر را در آن قرار دهید:

    <?php

    echo time();

    ?>

بعد از اجرا عددی مانند 1876894562 برای شما نمایش داده خواهد شد. این عدد قابل فهم نیست و با استفاده از توابعی می توان آن را به یک تاریخ و زمان قابل فهم تبدیل کرد.

تابع ()getdate

این تابع می تواند خروجی که از تابع time بدست می آید را به عنوان ورودی دریافت کند. خروجی این تابع آرایه ای از اطلاعات مربوط به تاریخ است. اگر شما ورودی این تابع را مشخص نکنید، تابع از خروجی کنونی تابع time استفاده می کند.

در جدول زیر لیست المان‌های آرایه‌ای که از تابع getdate بدست می‌آید را مشاهده می کنید:

شماره کلید و توضیح مثال
1 seconds

تعداد ثانیه‌های گذشته از دقیقه کنونی (0-59)

20
2 minutes

تعداد دقایق گذشته از ساعت کنونی (0 – 59)

29
3 hours

تعداد ساعت‌های گذشته از روز کنونی (0 – 23)

22
4 mday

روز ماه کنونی (1 – 31)

11
5 wday

روز هفته کنونی (0 – 6)

4
6 mon

ماه سال کنونی (1 – 12)

7
7 year

سال (4 رقمی)

1997
8 yday

روزکنونی در سال جاری ( 0 – 365 )

19
9 weekday

روز جاری در هفته کنونی

Thursday
10 month

ماه جاری در سال کنونی

January
11 0

Timestamp – تایم‌استامپ

948370048

حال شما می‌توانید با استفاده از داده‌های فوق کنترل کاملی را بر روی تاریخ و ساعت داشته باشید. شما می‌توانید بر اساس فرمت مورد نیاز خود از داده‌های بالا استفاده کنید.

به مثال زیر توجه کنید:

    <?php
       $date_array = getdate();
       
       foreach ( $date_array as $key => $val ){
          print "$key = $val<br />";
       }
    	
       $formated_date  = "Today's date: ";
       $formated_date .= $date_array['mday'] . "/";
       $formated_date .= $date_array['mon'] . "/";
       $formated_date .= $date_array['year'];
       
       print $formated_date;
    ?>

نتیجه اجرای کد فوق مانند زیر است:

seconds = 37

minutes = 49

hours = 09

mday = 23

wday = 23

mon = 4

year = 2017

yday = 157

weekday = Sunday

month = April

0 = 1876894562

Today’s date: 23/4/2017

تبدیل timestamp با تابع ()date

 منظور از timestamp خروجی تابع time است. تابع date شکل فرمت بندی شده ای از تاریخ و زمان را نشان می دهد. تعداد بسیار زیادی فرمت بر حسب خلاقیت یا نیاز خود با این تابع بدست آورید. کد استاندارد این تابع به شکل زیر است:

date(format,timestamp)

تابع date نیز می‌تواند timestamp مورد نظرتان را به صورت اختیاری به عنوان ورودی دریافت کند و اگر این ورودی تعیین نشود، از زمان کنونی استفاده خواهد شد. در جدول زیر لیستی از فرمت‌هایی که می‌توانید با این تابع استفاده کنید آورده شده است:

شماره فرمت و توضیح مثال
1 a

‘am’ یا ‘pm’ با حروف کوچک

pm
2 A

‘AM’ یا ‘PM’ با حروف بزرگ

PM
3 d

روز جاری در ماه کنونی

20
4 D

روز هفته جاری (سه کاراکتر)

Thu
5 F

نام ماه جاری

January
6 h

ساعت (فرمت ۱۲ ساعته – اعداد تک رقمی با یک صفر پیش از عدد)

12
7 H

ساعت (فرمت ۲۴ ساعته – اعداد تک رقمی با یک صفر پیش از عدد)

22
8 g

ساعت (فرمت ۱۲ ساعته  – اعداد تک رقمی بدون یک صفر پیش از عدد)

12
9 G

ساعت (فرمت ۲۴ ساعته – اعداد تک رقمی بدون یک صفر پیش از عدد)

22
10 i

دقیقه ( 0 – 59 )

23
11 j

روز ماه جاری (اعداد تک رقمی بدون یک صفر پیش از عدد)

20
12 l (حرف کوچک ‘L’)

روز هفته

Thursday
13 L

کبیسه بودن سال (‘1’ بله, ‘0’ خیر)

1
14 m

ماه جاری سال کنونی (عدد – اعداد تک رقمی با یک صفر پیش از عدد)

1
15 M

ماه جاری سال کنونی (سه کاراکتر)

Jan
16 r

فرمت RFC 2822

Thu, 21 Dec 2000 16:01:07 +0200
17 n

ماه جاری سال کنونی (عدد – اعداد تک رقمی بدون یک صفر پیش از عدد)

2
18 s

ثانیه‌های گذشته شده از دقیقه جاری

20
19 U

تایم‌استامپ

948372444
20 y

سال (دو رقم)

06
21 Y

سال (چهار رقم)

2006
22 z

روز کنونی سال جاری (0 – 365)

206
23 Z

افست ثانیه‌ها از GMT

+5

حال برای مثال کد زیر را در یک فایل وارد کرده و آن را اجرا کنید:

    <?php
       print date("m/d/y G.i:s<br>", time());
       print "Today is ";
       print date("j of F Y, \a\\t g.i a", time());
    ?>

خروجی کد بالا مانند زیر خواهد بود:

04/23/17 10.02:17<bthu, 23=”” apr=”” 2017=”” 10:02:17=”” +0000=””>Today is 23 2017s April 2017, at 10.02 am

در جلسه بعدی با شمسی سازی تاریخ در php آشنا خواهیم شد.

آموزش کامل PHP – قسمت 23: حلقه foreach و خواندن فایل ها

در ادامه جلسه قبل، کار با فایل ها در php را ادامه می دهیم و ابتدا به معرفی حلقه foreach می پردازیم. سپس به خواندن فایل ها می رسیم.

حلقه foreach

اگر به خاطر داشته باشید در جلسات قبل گفتیم که در php حلقه های دیگری هم وجود دارد و به آن ها خواهیم پرداخت. حلقه foreach فقط برای آرایه ها مورد استفاده قرار خواهد گرفت و در هر بار اجرای حلقه کلید و محتوای یک عضو از آرایه را باز می‌گرداند. برای استفاده از این حلقه دو روش وجود دارد که به صورت زیر می‌باشد:

foreach (array as $value){

    //code to run

}

//or

foreach (array as $key => $value){

    //code to run

}

در روش اول، مقدار هر عضو از آرایه مورد نظر در هر بار اجرای حلقه در متغیری به نام value$ قرار می‌گیرد و در هر بار اجرای حلقه می‌توان یک عضو ار آرایه را به عنوان مثال چاپ کرد یا عملیات دلخواه را روی آن انجام داد. اما در روش دوم، کلید هر عضو از آرایه را به key$ تغییر داده‌ایم و سپس مقدار هر عضو آرایه را در متغیر value$ قرار می‌دهیم.

برای درک بهتر به مثال زیر توجه کنید. در این مثال یک آرایه به نام names داریم که شامل چند نام است. قصد داریم با استفاده از حلقه foreach تک تک نام‌های موجود در این آرایه را چاپ کنیم:

<?php

$AllNames = Array("mojtaba", "hossein", "milad", "hamid", "masoud","mehdi");

foreach ($AllNames as $name)

{

    echo $name . "<br>";

}

?>

با اجرای کد فوق، تمامی نام‌های موجود در آرایه AllNames هر کدام در یک خط در مرورگر نمایش خواهند یافت. حال که با این حلقه هم آشنا شدید به ادامه مبحث کار با فایل ها می‌پردازیم.

خواندن فایل‌ها

با استفاده از تابع ()file می‌توانیم فایل مورد نظرمان را بخوانیم. این تابع فایل مورد نظر را در قالب یک آرایه برای ما آماده می‌کند و هر المان از فایل را به عنوان یک عضو از آرایه در نظر می‌گیرد.

درادامه  جلسه قبل، فایل names.txt را در نظر بگیرید، اکنون باید شامل چند نام باشد. در واقع در هر خط از این فایل یک نام نوشته شده است. حال در پوشه files که در پوشه htdocs یا www ایجاد کرده بودید، یک فایل جدید به نام read.php ایجاد کنید. سپس کد زیر را در این فایل قرار دهید:

<?php

$read = file("names.txt");

foreach($read as $name)

{

    echo $name . " - "; 

}

?>

کد بالا تمام نام‌های موجود در فایل names.txt را که در کنار فایل read.php وجود دارد خوانده و آن‌ها را با علامت – از هم جدا می‌کند. از آنجا که در اینجا محتویات فایل در یک آرایه قرار داده شده از foreach استفاده کرده‌ایم، همانطور که گفتیم این حلقه فقط برای آرایه‌ها بکار گرفته می‌شود.

از آنجا که پس از هر نام یک علامت خط فاصله – قرار داده‌ایم، پس از رسیدن به انتهای فایل باز هم پس از نام آخر یک علامت – قرار خواهد گرفت. برای جلوگیری از اضافه شدن خط فاصله پس از آخرین نام باید ابتدا بفهمیم که چه زمانی به انتهای فایل رسیده‌ایم. بدین منظور از کدی مثل کد زیر باید استفاده کنید:

$read = file("names.txt");

$count = count($count);

$i = 1;

foreach ($read as $line)

{
    echo $line;

        if($i < $count){

            echo " - ";

        }

        $i++;

}

?>

در کد بالا ابتدا با تابع count اقدام به شمارش تعداد اعضای آرایه read$ کرده‌ایم. همانطور که می‌دانید آرایه یاد شده در واقع دربرگیرنده محتویات فایل names.txt است. سپس با یک حلقه for تمامی اعضای این آرایه را چاپ می‌کنیم و در هر بار اجرای حلقه یک واحد به متغیر i$ اضافه می‌کنیم. این متغیر تعداد خطوط را نگهداری می‌کند. در شرط حلقه بررسی می‌کنیم که آیا به آخرین خط فایل یعنی آخرین عضو آرایه read رسیده‌ایم یا خیر، اگر همچنان به انتهای فایل نرسیده باشیم کاراکتر – در ادامه نام‌ چاپ می‌شود و اگر به آخرین خط فایل رسیده باشیم از آنجا که در حلقه چنین شرطی را نوشته‌ایم، پس شرط برای خط آخر برقرار نیست و کاراکتر – پس از نام چاپ نمی‌شود.

اصول کار با فایل‌ها را نیز در این جلسه یاد گرفتید و امیداوریم مباحث این جلسه نیز مورد رضایت شما واقع شده باشد. در صورتی که هرگونه سوالی در مورد این جلسه دارید لطفا آن را در بخش نظرات اعلام کنید. در جلسات آینده به تکمیل سیستم مدیریت محتوای خود بر اساس آنچه تا کنون آموخته‌ایم خواهیم پرداخت. همچنین پس از تکمیل این سیستم مدیریت محتوا سری جدید آمورش پی‌اچ‌دی در سطح حرفه‌ای‌تر را آغاز خواهیم کرد.