PDA

View Full Version : PHP - Làm sao để send biến qua included file



Newbie05
26-02-2010, 15:24
Chào các bạn,

Giả sử mình có 1 file php như thế này

* File A.php:

$abc = '123';

function printHello($name)
{
echo 'Hello ' . $name;
}

assign ($abc)

include ('B.php');


Và 1 file như vầy

* File B.php
echo $abc
// Hoặc bằng 1 cách nào đó lấy được giá trị của $abc
printHello($name)
// Hoặc chạy được hàm tương ứng với hàm trên

Shellingfox
26-02-2010, 15:52
Chào các bạn,

Giả sử mình có 1 file php như thế này

* File A.php:

$abc = '123';

function printHello($name)
{
echo 'Hello ' . $name;
}

assign ($abc)

include ('B.php');


Và 1 file như vầy

* File B.php
echo $abc
// Hoặc bằng 1 cách nào đó lấy được giá trị của $abc
printHello($name)
// Hoặc chạy được hàm tương ứng với hàm trên

Theo như yêu cầu của bạn thì đâu có cần làm gì :|. Làm như bạn thì từ trong file B.php có thể truy cập vào biến $abc hoặc hàm printHello như bạn đã định nghĩa mà.:emlaugh::emlaugh::emlaugh::emlaugh:

ducuytran
26-02-2010, 16:06
Cách 1: include cả 2 file
Cách 2: include file chứa biến, lấy giá trị lưu vào session
Cách 3: include file chứa biến, lấy giá trị và truyền qua method GET
...

Newbie05
26-02-2010, 16:33
Hic, bạn Shellingfox chưa thử qua việc này đúng không. Nếu khai báo biến trong file B.php thi trong A.php hoàn toàn có thể sử dụng được. Còn trường hợp này ngược lại bạn à. Còn việc thực hiện theo cách của bạn ducuytran thì 3 cách trên không ổn rồi, tuy nhiên bạn có thể giải thích rõ cách 1 hơn không

kenphan19
26-02-2010, 16:34
cái global variable dùng để làm gì trời !

Newbie05
26-02-2010, 16:38
Ờ, cái này để mình làm thử xem sao. Nhưng nếu nhiều global quá có vấn đề gì về bộ nhớ hay vấn đề gì khác không? Còn cái function thì sao?

Shellingfox
26-02-2010, 16:49
Hic, bạn Shellingfox chưa thử qua việc này đúng không. Nếu khai báo biến trong file B.php thi trong A.php hoàn toàn có thể sử dụng được. Còn trường hợp này ngược lại bạn à. Còn việc thực hiện theo cách của bạn ducuytran thì 3 cách trên không ổn rồi, tuy nhiên bạn có thể giải thích rõ cách 1 hơn không

Thử nói rõ hơn ý của bạn coi sao? Mình thử chẳng có vấn đề gì hết trơn.
Source của bạn đâu có gọi lại mấy biến từ trong hàm nào đâu nên xài global không giải quyết được vấn đề vì các biến của bạn khai báo đã nằm chung 1 scope rồi.


Mình test thử rồi, bạn khai báo biến trong A.php thì trong B.php vẫn sử dụng được mà:chris::chris:, kể cả ngược lại định nghĩa trong B thì A vẫn gọi được :|.
Đây là code mình test:
A.php


<?php
// Định nghĩa biến $abc
$abc = '123';

// Định nghĩa hàm printHello
function printHello($name) {
echo 'Hello ' . $name;
}
// include file B.php
include('B.php');

// Gọi biến từ file B.php
echo $cde;


B.php


<?php
// Lấy biến $abc từ file A.php
echo $abc;
// Gọi hàm printHello từ file A.php
printHello('Shellingfox');

// Định nghĩa biến trong file B
$cde = '456';


Kết quả:


123Hello Shellingfox456


Đâu có gặp vấn đề gì :|

vannhothanh
26-02-2010, 16:59
ban nen kham khao tai day php nuke 8.1

Newbie05
26-02-2010, 17:18
Thôi để mình nói thiệt ý đồ ra luôn. Như thế này:

File View.php:

<?php
class View
{
static public function display($templateFile)
{
include(_L_THEME_DIR_.$templateFile);
}

static public function assignVar($name, $value)
{
??????
}

static public function assignFunction($name, $paramType, $returnType)
{
??????
}
}
?>

File index.php:

<?php
include ('View.php');

function doTesting($value, 'in')
{
return $value;
}

View::assignVar('test', 10);
View::assignFunction('doTesting', 'string', 'string');
View::display('index.html');
?>

File index.html:

<?php
echo $test;
echo $doTesting('ABCDEF');
?>

Mình đang thiết kế 1 template engine "cây nhà lá vườn". Giúp mình với nha.

Shellingfox
26-02-2010, 17:21
Thôi để mình nói thiệt ý đồ ra luôn. Như thế này:

File View.php:

<?php
class View
{
static public function display($templateFile)
{
include(_L_THEME_DIR_.$templateFile);
}

static public function assignVar($name, $value)
{
??????
}

static public function assignFunction($name, $paramType, $returnType)
{
??????
}
}
?>

File index.php:

<?php
include ('View.php');

function doTesting($value, 'in')
{
return $value;
}

View::assignVar('test', 10);
View::assignFunction('doTesting', 'string', 'string');
View::display('index.html');
?>

File index.html:

<?php
echo $test;
echo $doTesting('ABCDEF');
?>

Mình đang thiết kế 1 template engine "cây nhà lá vườn". Giúp mình với nha.


À hóa ra bạn muốn xử dụng cái kiểu này. Cái này thì không phải là trong include rồi.

Bạn thử hàm eval thử, có cần example thì nói mình.

Newbie05
26-02-2010, 17:26
Nếu được vậy thì hay quá. Mình cũng chưa hiểu lắm về cơ chế hoạt động của các template engine ví dụ như Smarty. Lúc đầu định dùng Smarty nhưng thấy no phải compile code mất 1 quá trình xử lý nên k0 ổn về tốc độ cho nên tính làm 1 cái template engine đơn giản hơn nó để sử dụng thôi. Mình rất mong sự hỗ trợ của bạn. Thanks very much!

Shellingfox
26-02-2010, 17:36
Đây là ví dụ cơ bản mình vừa viết cho bạn nè:

Views.php


<?php

/**
* Định nghĩa class View cho phép truy cập static
* @author Shellingfox
*
*/
class View {

// Lưu giữ các biến
static private $variables;

// Lưu các biến
static function assignVar($name, $value) {
return self::$variables[$name] = $value;
}

// Hàm xử lý và in ra các file
static function display($templateFile) {
// Xử lý các biến
foreach (self::$variables as $key => $value) {
$$key = $value;
}
// Đọc nội dung file template
$templateContent = file_get_contents($templateFile);
// Đưa các biến vào file template
eval("\$templateContent = \"$templateContent\";");
// In ra nội dung file template đã được parse
echo $templateContent;
}
}


index.php


<?php
include 'Views.php';

View::assignVar('name', 'Shellingfox');
View::display('hello.html');


hello.html


<h3>Hello $name</h3>


Kết quả khi chạy index.php:


Hello Shellingfox



Đây là code mình viết nhanh cho bạn nên còn nhiều cái khác bạn cần phải làm để dùng chính thức như cache, rồi bạn coi viết cho các hàm của bạn, mà với mình thì nghĩ không nên đưa hàm vô lưu trữ rồi sau đó gọi lại vì hàm khi được php đọc nó đã lưu giữ trong bộ nhớ rồi, bạn làm vậy là bị duplicate.
Với cách này mình sử dụng eval, bạn hiểu concept của nó như vầy rồi thử tìm cách khác thay thế coi sao.

Lời khuyên cho bạn: Bản thân PHP đã là một template engine rồi nên những gì bạn đang làm đây mình thấy thực sự không cần thiết lắm :">.

Newbie05
26-02-2010, 17:51
Ồ, nếu như không assign hàm thì làm sao để mình có thể chạy hàm trong file hello.html được? Có cách nào khác không bạn?

Shellingfox
26-02-2010, 20:56
Ồ, nếu như không assign hàm thì làm sao để mình có thể chạy hàm trong file hello.html được? Có cách nào khác không bạn?

Tại sao lại phải gọi hàm trong file hello.html? Mình hoàn toàn có thể thực hiện việc đó trước và trong đó chứa kết quả thôi mà. Các template engine khác mình biết thì cũng không chơi cái kiểu đó đâu vì security risk cho việc này rất là lớn.

Cái mình đưa mẫu cho bạn chỉ là cho bạn thấy cái ý tưởng thực hiện vậy thôi. Muốn hoàn chỉnh bạn nên coi thêm các source khác như là template của phpBB cực kỳ hay đó. Không lẽ mình làm hết cho bạn :w00t::w00t::w00t:.

OK vậy cho bạn luôn ví dụ để gọi hàm nè:

View.php


<?php

/**
* Định nghĩa class View cho phép truy cập static
* @author Shellingfox
*
*/
class View {

// Lưu giữ các biến
static private $variables;
static private $functions;

// Lưu các biến
static function assignVar($name, $value) {
return self::$variables[$name] = $value;
}

// Lưu các hàm
static function assignFunction($name) {
return self::$functions[] = $name;
}

// Hàm xử lý và in ra các file
static function display($templateFile) {
// Lấy các biến và hàm ta đã lưu
extract(self::$variables, EXTR_SKIP);
extract(self::$functions, EXTR_SKIP);

// Vì chưa biết chắc là trong file template có gọi các hàm khác hay không
// và nếu đoạn mã php trong file template sinh ra lỗi thì cả chương trình bị ngắt
// Làm cách này để tranh lỗi đó
ob_start();
include $templateFile;
print ob_get_clean();
}
}


index.php


<?php
include 'Views.php';


function doTesting($value) {
return 'Hello ' . $value;
}

View::assignVar('name', 'Shellingfox');
View::assignFunction('doTesting');
View::display('hello.html');


hello.html


<h3>Hello <?php echo $name; ?></h3>

<p>
<?php echo doTesting('Shellingfox');?>
</p>



P/S: Hiểu qua ý tưởng thì bạn viết lại cho ngon lành và nhớ làm theo cách này thì: "Run as your own risk" nha.

thuyduongcd
27-02-2010, 09:43
Làm gì mà phức tạp thế
1 là dùng global. cần dùng cái nào thì global cái đó
2 là truyền bằng GET include("/b.php?abc=$abc")

Newbie05
09-03-2010, 13:40
Chào các bạn,
Mấy bữa nay mình bận việc quá không tiện ghé thăm diễn đàn và cũng chưa kịp nói lời cảm ơn với bạn Shellingfox :D. Nhờ sự giúp đỡ của bạn mình đã giải quyết được vấn đề rồi. Thanks bạn nhìu nhìu nhe. Nhân tiện cho mình hỏi thêm luôn. Mình thực hiện đoạn code này không biết có sai chỗ nào không mà nó im ru, không báo lỗi gì hết làm sao mà lần được :D

/* Autoload */
function __autoload($className)
{
if (!class_exists($className, false))
{
try {
require_once(dirname(__FILE__).'/../classes/'.$className.'php');
} catch (Exception $e) {
require_once(dirname(__FILE__).'/../models/'.$className.'php');
echo 'Testing';
}
}
}