PDA

View Full Version : سوال: استفاده ازمتغیر بیرون کلاس در کلاس



navid3d_69
شنبه 05 مرداد 1392, 00:58 صبح
سلام من می خوام توی بعضی از کلاس ها از کلاس دیتابیس استفاده کنم

این کد زیر یک مثال از روش استفاده من هست




require './CMF/Config.php';

require './CMF/Libs/Class/Database.php';

$db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);


class test {
public function t(){
print_r($db->select("SELECT * FROM menu"));
}
}

$s = new test();
$s->t();


خب این کد بالا مشکل داره 100% توی فایل config اطلاعات دیتابیس هست و فایل database هم که کلاس دیتابیس هست حالا من می خوام توی کلاس test از کلاس دیتابیس استفاده کنم باید توی خود کلاس تست از کلاس دیتابیس یک شی بسازم تا بتونم استفاده کنم خب اگر نخوام این کار رو بکنم باید چی کار کنم؟ یعنی مثل همین روشی که توی کد بالا هست باشه ولی درست یعنی لازم نباشه توی هر کلاسی که می خوام از دیتابیس استفاده کنم یک شی از دیتابیس بسازم؟

T.R.G.T
شنبه 05 مرداد 1392, 01:34 صبح
میتونید از متغیر سراسری استفاده کنید

میتونید از یک کلاس هسته استفاده کنید که از طریق اون به تمام توابع و کلاس ها و.... دسترسی پیدا کنید(مثلا میتونید متد هایی برای فراخوانی ویرایش و... ایجاد کنید یا اینکه میتونید هنگام ایجاد کلاسی به کلاس سیستم دستور بدید که اگر فرمان X به تابع M داده شد متد Y رو از کلاس O فراخوانی کنه و حاصل رو برگردونه یا میتونید یک داده با نام Y در داخل کلاس هسته اضافه کنید و بگید که اگر دستور X وارد شد داده Y رو برگردون(با یک متغیر استاتیک یا قلوبال میتونید و متد افزودن دستور , حذف دستور , اجرای دستور و... میتونید این کار رو انجام بدید)

میتونید هنگام فراخوانی کلاس با متغیر مقدار دهیش کنی

navid3d_69
شنبه 05 مرداد 1392, 01:52 صبح
میشه یک مثال کد قرار بدین؟

MMSHFE
شنبه 05 مرداد 1392, 08:26 صبح
$GLOBALS['db']->select('SELECT * FROM `menu`');
// or
global $db;
$db->select('SELECT * FROM `menu`');

navid3d_69
شنبه 05 مرداد 1392, 09:03 صبح
خیلی ممنون ولی این کار اصولی هست ؟و مثلا میشه برای پروژه های بزرگ استفاده کرد؟

MMSHFE
شنبه 05 مرداد 1392, 10:32 صبح
متغیرهای سراسری هم مفهومی شبیه Session داره که همه جا اعتبار دارن با این تفاوت که وقتی کار اسکریپت تمام شد، مقدار این متغیرها از بین میره ولی ازنظر اعتبار، توی تمام بخشهای کد معتبر و قابل دسترسی هستن و استفاده از اونها هم از نظر اصولی، مشکلی نداره.

T.R.G.T
شنبه 05 مرداد 1392, 15:14 عصر
اینم کد میتونید با توجه به نیازتون متد System رو پیشرفته تر کنید یا اینکه توابعی برای کنترل کلاس ایجاد کنید(و شی System رو بصورت استاتیک مقداردهی کنید) تا دیگه لازم نباشه در هرجای برنامه یک شی ایجاد کنید



<?php
$System=new System;
$System->insert('Print_Value','test','prt');
$System->select('Print_Value','Damn Its Worked!');
$System->update_value('Print_Value','test','Hello World!');
$System->select('Print_Value');
class System{
static protected $variables;
var $processor=0;
var $request=0;
var $task=0;
var $args=0;
var $variablen=0;
var $value=0;
public function System(){
if(!is_array($this->variables[request])){
settype($this->variables[request],'array');
}
}
public function set_property(){
$fnc_num_idx=func_num_args();
$fnc_idx=func_get_args();
for($i=0;$i<$fnc_num_idx;$i+=2){
$j=$i+1;
switch ($fnc_idx[$i]){
case 'processor':$this->processor=$fnc_idx[$j];break;
case 'request':$this->request=$fnc_idx[$j];break;
case 'task':$this->task=$fnc_idx[$j];break;
case 'args':$this->args=$fnc_idx[$j];break;
case 'variablen':$this->variablen=$fnc_idx[$j];break;
case 'value':$this->value=$fnc_idx[$j];break;

}
}
}
public function unset_property(){
$fnc_num_idx=func_num_args();
if($fnc_num_idx){
$fnc_idx=func_get_args();
for($i=0;$i<$fnc_num_idx;$i++){
switch($fnc_idx[$i]){
case 'processor':unset($this->processor);break;
case 'request':unset($this->request);break;
case 'task':unset($this->task);break;
case 'args':unset($this->args);break;
case 'variablen':unset($this->variablen);break;
case 'value':unset($this->value);break;
}
}
}else{
unset(
$this->processor,
$this->request,
$this->task,
$this->args,
$this->variablen,
$this->value);
}
}
public function insert(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
$processor=$func_idx[1];
$task=$func_idx[2];
}else{
$request=$this->request;
$processor=$this->processor;
$task=$this->task;
}
if(!$this->exists($request)){
array_push($this->variables[request],$request);
if(class_exists($processor)){
$this->variables[objs][$request]=new $processor;
$this->variables[processor][$request]=$processor;
if(method_exists($this->variables[objs][$request],$task)){
$this->variables[task_type][$request]='method';
$this->variables[tasks][$request]=$task;
}elseif(property_exists($this->variables[objs][$request],$task)){
$this->variables[task_type][$request]='property';
}elseif($task==true){
$this->variables[task_type][$request]=$task;
}
}elseif(function_exists($processor)){
$this->variables[task_type][$request]='function';
}elseif(isset($GLOBALS[$processor])){
$this->variables[task_type][$request]='variable';
}else{
return false;
}
return true;
}else{
return false;
}
}
public function select(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
$args=array_slice($func_idx,1);
}else{
$request=$this->request;
$args=$this->args;
}
$processor=$this->variables[processor][$request];
if($this->exists($request)){
switch($this->variables[task_type][$request]){
case 'method':return call_user_method_array($this->variables[tasks][$request],$this->variables[objs][$request],$args);break;
case 'property':return $this->variables[objs][$request]->$processor;break;
case 'cclass':return new $processor($args);break;
case 'sclass':$this->variables[objs][$request];break;
case 'function':call_user_func_array($processor,$args); break;
case 'variable':return $GLOBALS[$processor];break;
}
}else{
return false;
}
}
public function delete(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
}else{
$request=$this->request;
}
if($this->exists($request)){
unset($this->variables[request][array_search($request,$this->variables[request])],
$this->variables[objs][$request],
$this->variables[processor][$request],
$this->variables[tasks][$request],
$this->variables[task_type][$request]);
}else{
return false;
}
}
public function update(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
$processor=$func_idx[1];
$task=$func_idx[2];
}else{
$request=$this->request;
$processor=$this->processor;
$task=$this->task;
}
if($this->exists($request)){
if($this->delete($request) and $this->insert($request,$processor,$task)){
return true;
}else{
return false;
}
}else{
return false;
}
}
public function update_value(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
$variablen=$func_idx[1];
$value=$func_idx[2];
}else{
$request=$this->request;
$variablen=$this->variablen;
$value=$this->value;
}
if($this->exists($request)){
if($this->variables[task_type][$request]=='method' or $this->variables[task_type][$request]=='property' or $this->variables[task_type][$request]=='sclass'){
if(property_exists($this->variables[objs][$request],$variablen) and method_exists($this->variables[objs][$request],'set_property')){
if($this->variables[objs][$request]->set_property($variablen,$value)){
return true;
}else{
return false;
}
}
}elseif($this->variables[task_type][$request]=='variable'){
$GLOBALS[$variablen]=$value;
return true;
}else{
return false;
}
}
}
public function exists(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$request=$func_idx[0];
}else{
$request=$this->request;
}
$reqidx=count($this->variables[request]);
for($i=0;$i<$reqidx;$i++){
if($request==$this->variables[request][$i]){
return true;
}
}
return false;
}
}
class test extends System{
var $test;
public function set_property(){
$func_idx=func_get_args();
$value=$func_idx[1];
$this->test=$value;
}
public function prt(){
$func_num_idx=func_num_args();
if($func_num_idx){
$func_idx=func_get_args();
$value=$func_idx[0];
}else{
$value=$this->test;
}
echo '<br />'.$value.'<br />';
}
}
?>

این کلاس میتونه متد , کلاس , پراپرتی , تابع , متغیر یک درخواست رو بخونه و کنترل کنه میتونه در خواس ایجاد حذف و آپدیت کنه

MMSHFE
شنبه 05 مرداد 1392, 15:17 عصر
عذر میخوام ولی ارتباط این کلاس رو با سؤال این دوستمون متوجه نشدم. اگه منظورتون استفاده از یک کلاس Registry برای این مقاصد هست، کار خوبیه ولی سؤال این دوستمون چیز دیگری بود.

T.R.G.T
شنبه 05 مرداد 1392, 15:23 عصر
ایشون فرمودن چطور میشه یک داده غیر محلی رو بصورت محلی استفاده کرد من هم در پست اولم گفتم میتونید از متغییر قلوبال استفاده کنید یا میتونید از یک کلاس برای کنترل و دسترسی به داده ها استفاده کنید ایشون فرمودند که کدی رو جهت راهنمایی بزارید شما لطف کردید متغییر قلوبال رو توضیح دادید بنده هم کد کلاس کنترل و دسترسی داده ها رو برای ایشون گذاشتم

MMSHFE
شنبه 05 مرداد 1392, 15:29 عصر
ممنون بابت به اشتراک گذاشتن دانشتون. موفق باشید.