反射 class 在 php 中是否有隐式方法 __toString()?
Does reflection class have implicit method __toString() in php?
我正在阅读https://www.amazon.com/PHP-MySQL-Web-Development-4th/dp/0672329166
.在 OOP 章节中,我实现了 page
class(下面的代码),然后在另一个脚本中尝试通过 Reflection("Page")
创建一个实例,然后尝试 [=18] =] 那 class (通过隐式方法 __toString()
,就像书中一样:
page.php:
<?php
class Page
{
public $content;
public function setContent(string $c)
{
$this->content = $c;
}
public $title = "Papaluz Corp";
public function setTitle(string $t)
{
$this->title = $t;
}
public $keywords = " Papaluz Consulting, Three Letter Abbreviation,
some of my best friends are search engines";
public function setKeywords(string $k)
{
$this->keywords = $k;
}
public $buttons = [
'Home' => 'home.php',
'Contact' => 'contact.php',
'Services' => 'services.php',
'About' => 'about.php'
];
public function setButtons(array $b)
{
$this->buttons = $b;
}
public function display()
{
echo "<html>\n<head>\n";
$this->displayTitle();
$this->displayKeywords();
$this->displayStyles();
echo "</head>\n<body>\n";
$this->displayHeader();
$this->displayMenu($this->buttons);
echo $this->content;
$this->displayFooter();
echo "</body>\n</html>\n";
}
public function displayTitle()
{
echo '<title>' . $this->title . '</title>';
}
public function displayKeywords()
{
echo '<meta name="keywords" content="' . $this->keywords . '"/>';
}
public function displayStyles()
{
?>
<link href="/2/default/style.css" rel="stylesheet">
<?php
}
public function displayHeader()
{
?>
<header>
<img src='/data/img/pap_white.png' width="130" height="130">
<h1>Papaluz Consulting</h1>
</header>
<?php
}
public function displayMenu(array $buttons)
{
echo '<nav>';
foreach ($buttons as $name => $url) {
$this->displayButton($name, $url, !$this->isUrlCurrentPage($url));
}
echo "</nav>\n";
}
public function displayFooter()
{
?>
<footer>
<p>© Papluz consulting Corp.<br>
please see our<a href='legal.php'>legal information page</a>.
</p>
</footer>
<?php
}
public function isUrlCurrentPage($url)
{
if (strpos($_SERVER['PHP_SELF'], $url) === false) {
return false;
} else {
return true;
}
}
public function displayButton($name, $url, $active = true)
{
if ($active) {
?>
<div class="menuitem">
<a href="<?= $url ?>">
<img src='/data/img/arrow_white.svg' width="20" height="20">
<span class='menutext'><?= $name ?></span>
</a>
</div>
<?php
} else {
?>
<div class="menuitem">
<!-- <img src='/data/img/arrow_white.svg'> -->
<span class='menutext'><?= $name ?></span>
</div>
<?php
}
}
}
class 本身并不重要,但是从 Reflection
class 推断它的尝试是:
foo.php:
<?php
require_once('page.php');
$class = new Reflection('Page');
echo '<pre>'.$class.'</pre>';
给出错误:
Recoverable fatal error: Object of class Reflection could not be converted to string in /var/www/html/2/foo.php on line 5
所以错误说 Reflection
class 没有方法 __toString()
,但因为它在书中作为示例,我认为它应该。那么如何回显变量 $class
,它是通过 Reflaction
class?
推断出的 Page
class
这本书和例子已经很过时了,2020年不建议这样开发。代码充满了XSS安全问题和糟糕的代码风格。不管怎样,你可以在这里试试这个来反映 class:
<?php
// ...
$reflector = new ReflectionClass('Page');
$properties = $reflector->getProperties();
foreach($properties as $property)
{
echo $property->getName() . "\n";
}
我正在阅读https://www.amazon.com/PHP-MySQL-Web-Development-4th/dp/0672329166
.在 OOP 章节中,我实现了 page
class(下面的代码),然后在另一个脚本中尝试通过 Reflection("Page")
创建一个实例,然后尝试 [=18] =] 那 class (通过隐式方法 __toString()
,就像书中一样:
page.php:
<?php
class Page
{
public $content;
public function setContent(string $c)
{
$this->content = $c;
}
public $title = "Papaluz Corp";
public function setTitle(string $t)
{
$this->title = $t;
}
public $keywords = " Papaluz Consulting, Three Letter Abbreviation,
some of my best friends are search engines";
public function setKeywords(string $k)
{
$this->keywords = $k;
}
public $buttons = [
'Home' => 'home.php',
'Contact' => 'contact.php',
'Services' => 'services.php',
'About' => 'about.php'
];
public function setButtons(array $b)
{
$this->buttons = $b;
}
public function display()
{
echo "<html>\n<head>\n";
$this->displayTitle();
$this->displayKeywords();
$this->displayStyles();
echo "</head>\n<body>\n";
$this->displayHeader();
$this->displayMenu($this->buttons);
echo $this->content;
$this->displayFooter();
echo "</body>\n</html>\n";
}
public function displayTitle()
{
echo '<title>' . $this->title . '</title>';
}
public function displayKeywords()
{
echo '<meta name="keywords" content="' . $this->keywords . '"/>';
}
public function displayStyles()
{
?>
<link href="/2/default/style.css" rel="stylesheet">
<?php
}
public function displayHeader()
{
?>
<header>
<img src='/data/img/pap_white.png' width="130" height="130">
<h1>Papaluz Consulting</h1>
</header>
<?php
}
public function displayMenu(array $buttons)
{
echo '<nav>';
foreach ($buttons as $name => $url) {
$this->displayButton($name, $url, !$this->isUrlCurrentPage($url));
}
echo "</nav>\n";
}
public function displayFooter()
{
?>
<footer>
<p>© Papluz consulting Corp.<br>
please see our<a href='legal.php'>legal information page</a>.
</p>
</footer>
<?php
}
public function isUrlCurrentPage($url)
{
if (strpos($_SERVER['PHP_SELF'], $url) === false) {
return false;
} else {
return true;
}
}
public function displayButton($name, $url, $active = true)
{
if ($active) {
?>
<div class="menuitem">
<a href="<?= $url ?>">
<img src='/data/img/arrow_white.svg' width="20" height="20">
<span class='menutext'><?= $name ?></span>
</a>
</div>
<?php
} else {
?>
<div class="menuitem">
<!-- <img src='/data/img/arrow_white.svg'> -->
<span class='menutext'><?= $name ?></span>
</div>
<?php
}
}
}
class 本身并不重要,但是从 Reflection
class 推断它的尝试是:
foo.php:
<?php
require_once('page.php');
$class = new Reflection('Page');
echo '<pre>'.$class.'</pre>';
给出错误:
Recoverable fatal error: Object of class Reflection could not be converted to string in /var/www/html/2/foo.php on line 5
所以错误说 Reflection
class 没有方法 __toString()
,但因为它在书中作为示例,我认为它应该。那么如何回显变量 $class
,它是通过 Reflaction
class?
Page
class
这本书和例子已经很过时了,2020年不建议这样开发。代码充满了XSS安全问题和糟糕的代码风格。不管怎样,你可以在这里试试这个来反映 class:
<?php
// ...
$reflector = new ReflectionClass('Page');
$properties = $reflector->getProperties();
foreach($properties as $property)
{
echo $property->getName() . "\n";
}