小编Tim*_*nen的帖子

对象内的php对象,获取顶级对象实例

我正在尝试PHP OOP

我想要找到的是,是否可以通过使用在此对象实例中创建的对象来访问对象实例?

听起来令人困惑,所以这是一个例子:

索引的内容


    class mainclass {
        var $data;
        function __construct($data){
            $this->data = $data;
        }
        function echodata(){
            echo $this->data;
        }
        function start($classname){
            include $classname.'.php';
            $inner = new $classname();
            $inner->show();
        }

    }

    $mainclass = new mainclass('maininfostuff');
    $mainclass->start('innerclass');



    //i want it to echo "maininfostuff"
Run Code Online (Sandbox Code Playgroud)

innerclass.php的内容


class innerclass{
        function show(){
            mainclass->echodata();//the problem is here
        }
}
Run Code Online (Sandbox Code Playgroud)

这个测试用例的目的是让内部类决定是否/何时运行mainclass echodata函数

如何完成上述例子?(不依赖于静态类或单例或扩展类)

编辑: 由于答案中的一些混乱,我编辑了这个例子

php oop object

5
推荐指数
3
解决办法
9570
查看次数

php:类懒惰加载?

我有一个问题,这是我过去几天一直在考虑的问题.在php应用程序中,您需要执行以下操作:

  1. 定义它
  2. 像这样运行一个函数:(使用自动加载和注册表对象)
  3. $ registry-> obj = new mathClass($ var1,$ var2); //创建对象,其中$ var1保存数据库对象,$ var2保存值1
  4. $登记处送交> obj->计算( '值'); //获取产品行并返回其总值.这样在脚本中的任何时候我都可以简单地运行我事先定义的计算函数(或其他一些函数).

想象一下,一个Web应用程序有数百个类,这些类可能需要或可能不需要这个特定的页面加载,但只能在应用程序的开头定义.我想要的解决方案就是运行

$obj->calculate('price'); 
Run Code Online (Sandbox Code Playgroud)

没有创建对象,例如像这样

mathclass::calculate('price'); 
Run Code Online (Sandbox Code Playgroud)

然后根据需要自动加载数学类而不需要主要开销,这里的问题是我不能再在数学类中给出任何变量

($var1,$var2).
Run Code Online (Sandbox Code Playgroud)

我想要的是能够伪造对象而不需要对类发生任何自动加载,以免增加开销,但是对象用变量创建自己,但只有当我真的需要用它做什么时.

我的意思是php真的希望我在开始时定义每个类,以便我以后可以使用它们吗?这是懒人装吗?急切加载?

我可能会解释这个问题,所以请指出我正确的方向.

编辑2015:简单的伪代码示例解决方案:

class Service {
    private $cb, $instance;
    public function __construct($cb){
        $this->cb = $cb;
    }
    public function __invoke() {
        if(!$this->instance){
            $this->instance = call_user_func($this->cb);
        }
        return $this->instance;
    }
}

// setup autoloading
set_include_path(__DIR__.'/vendor'. PATH_SEPARATOR .get_include_path()); // optional
spl_autoload_register(function($c){
    include preg_replace('#\\\|_(?!.+\\\)#','/',$c).'.php';
});

// simple dependency injection
$service['db'] = new Service(function(){
    return new Database('sqlite::filename.sqlite');
});
$service['config'] = …
Run Code Online (Sandbox Code Playgroud)

php

5
推荐指数
1
解决办法
6584
查看次数

复杂的 HTML 表单

这个问题并不像它长那么难,它很长是因为我不擅长解释事情,版主在减少这个问题的长度或改进它的标题(同时保持它的含义)方面的任何帮助将不胜感激。

我正在设计一个可以处理复杂表单的通用应用程序,但要做到这一点,我需要决定如何自己处理表单......所以让我们暂时忘记服务器后端。我已经对此进行了一段时间的研究,但似乎找不到任何不过时或不相关的内容。

对我来说,解释这一点的最简单方法是举个例子,所以让我们以一个假设的“商人”和“客户数据库”为例:

一位自雇商人决定为他的每个客户保留一份记录,他可以在其中存储他们的所有姓名、电话号码、电子邮件、国家/地区、城市和出生日期。为此,他使用了一个网络应用程序,他可以在手机上或在家里的旧办公室电脑上打开该应用程序。但可悲的是,这个商人也是偏执狂,关闭了他电脑上的所有 JavaScript。

商人可能会指派他的秘书添加客户数据,因此我们将编辑表单的人称为“用户”。

此表单的难点在于支持多个电话和电子邮件,以及没有 JavaScript 的国家 > 城市选择。

有几种解决方案,最简单的方法是首先存储客户,然后在他实际存在后给他所有的电话号码、电子邮件和国家,但在这种情况下,客户需要选择他/她的国家和存储时至少有一个电话号码。

选择国家和城市可以通过一个带有“选择国家”字段的表单和一个没有任何值的禁用“选择城市”和一个显示“选择国家”或类似内容的按钮来完成……它将使用很少使用的表单按钮,类似于这样的东西:

<h2>General info</h2>
...name, surname, gender, age selection...
<h2>Country and city</h2>
<p><label>Select country: </label><select name="country">
<option value="United Kingdom">United Kingdom</option> 
<option value="United States">United States</option> 
<option value="France">France</option> 
<option value="Germany">Germany</option> 
<option value="Spain">Spain</option> 
<option value="Italy">Italy</option> 
<option value="Canada">Canada</option></select>
<input type="button" name="select[country]" value="Select Country" /></p>
<p>Select city: <select disabled="disabled"><option value="">No city selected<option></select> (you must first select a country)</p>
Run Code Online (Sandbox Code Playgroud)

用户点击“选择国家”按钮,表单将显示他输入的所有数据和一个基于他选择的国家的“城市”选择字段(只要表单验证它输出的数据,并使用唯一的令牌作为表单,它应该是安全的)它还会将国家选择字段显示为禁用,他选择的国家作为所选值,以及一个按钮来清除他的选择,我们这样做是为了防止用户选择国家,例如“United州”,然后是城市“纽约”,后来更改了他在国家/地区的选择,并阻止他提交具有 country="Uruguay" 和 city="New York" 值的表单。

另一种方法是仅显示一个名为“选择国家/城市”的按钮,单击该按钮会导致国家选择表单,然后又会导致城市选择表单,提交时会将用户返回到他开始的表单。但我认为上面的解决方案更好。

如果有更好的方法,请纠正我。

然后在选择国家和城市后,表单的用户必须在尚未存储的“客户端”中添加至少一个电话号码。(电子邮件将以相同的方式处理)这部分,我还没有设法做到,希望得到一些帮助。到目前为止,我所拥有的就是:

...name, surname, gender, age selection...
...country/city selection... …
Run Code Online (Sandbox Code Playgroud)

html forms

5
推荐指数
1
解决办法
3949
查看次数

在交叉引用表中创建带有两个外键的MySQL表

这可能来自一些缺乏知识或简单的愚蠢,但我想了解如何在交叉引用表中创建外键:

例如,我有两个表,项目和图像

CREATE TABLE `item` (
    `id` INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL,
    `description` MEDIUMTEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `image` (
    `id` INT(11) UNSIGNED AUTO_INCREMENT,
    `file` VARCHAR(255) UNIQUE NOT NULL,
    `caption` VARCHAR(255),
    PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我想将任何图像引用到任何项目,所以我创建一个这样的交叉引用表:

CREATE TABLE `item_image` (
    `item` INT(11) UNSIGNED NOT NULL,#foreign key
    `img` INT(11) UNSIGNED NOT NULL,#foreign key
    PRIMARY KEY(`item`,`img`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

但是item_image表包含外键列,所以我试着像这样限制它们

CREATE TABLE `item_image` (
    `item` INT(11) UNSIGNED NOT NULL,
    `img` INT(11) UNSIGNED NOT …
Run Code Online (Sandbox Code Playgroud)

mysql database-design foreign-keys mysql-workbench

5
推荐指数
1
解决办法
5560
查看次数

检查字符串是否为图像

有一个字符串格式的图像,输出带有一些mime类型标题的字符串就足以在页面上呈现它,如何检查该字符串是否是图像?

php image

5
推荐指数
1
解决办法
2957
查看次数

编程方法论.何时编写单用途功能?

我很抱歉,但我无法定义我想弄清楚的"事情".

在编写函数时我们可以采用不同的方法,我已经做了一些"占位符"示例:

--------A---------
getImageSmall();
getImageLarge();
getTextSmall();
getTextLarge();
--------B---------
getImage('small');
getImage('large');
getText('small');
getText('large');
--------C---------
get('image','small');
get('image','large');
get('text','small');
get('text','large');
--------D---------
get(array('type'=>'image','size'=>'small'));
get(array('type'=>'image','size'=>'large'));
get(array('type'=>'text','size'=>'small'));
get(array('type'=>'text','size'=>'large'));
--------E---------
get('{"type":"image","size"=>"small"}');
get('{"type":"image","size"=>"large"}');
get('{"type":"text","size"=>"small"}');
get('{"type":"text","size"=>"large"}');
Run Code Online (Sandbox Code Playgroud)

我也可以包含对象,但我现在更喜欢保持简单.

"D"中的数组是一个php数组,用于显示使用json的示例"E"之间的区别.

您可以看到这种方法如何逐渐从一种思维方式转变为另一种方式,其中功能定义转向信息交换.这并不意味着"get"函数是执行所有操作的主函数,它可能是调用其他函数的信使函数,其唯一目的可能是将应用程序转换为服务.

问题是:

  • 编码风格的这种转变叫什么?(主要问题)
  • 什么时候最好用哪个?
  • 我在哪里可以阅读更多相关信息?

欢迎澄清和评论/问题/答案,以改善这个问题.

php theory coding-style code-organization

5
推荐指数
1
解决办法
706
查看次数

如何使用swiftmailer获取电子邮件队列ID?

当我使用telnet发送电子邮件时,smtp服务器会在发送电子邮件250 2.0.0 Ok: queued as 7A821440123E时回复我.所以我需要获取ID 7A821440123E来跟踪邮件日志中的电子邮件.使用Swiftmailer获取此功能是否可行?

php swiftmailer

5
推荐指数
1
解决办法
2441
查看次数

错误表'mysql.servers'不存在

当我尝试创建一个新的数据库用户时,我从plesk得到错误"表'mysql.servers'不存在",创建的用户没有出现在任何地方,但名称仍然保留,并且它不允许我访问数据库.

编辑: 我无法登录phpMyAdmin到这个网络服务器,所以我设法通过一个不同的域登录到它,它告诉我一个通知:你的PHP MySQL库版本5.0.90不同于你的MySQL服务器版本5.1.49 .这可能会导致不可预测的行为.

编辑: 手动安装phpmyadmin然后手动安装libmcrypt(这是我的cruddy服务器技能的成就:D),以便phpmyadmin工作.然后偶然发现如何通过plesk以root身份登录(诀窍是在不选择任何数据库的情况下输入webadmin),至少我认为它是root:S运行sql:GRANT SELECT ON mysql.*to'my-user'@'本地主机"; 成功的消息回到了plesk,看看我是否可以使用"my-user"管理sql而不是,它仍然缺少可用用户,但名称仍然保留...试图运行:mysql_fix_privilege_tables -user = root -password = mypasswordobviosuly -verbose但是给出了错误,我仍然不确定如何在不使用ssh的情况下运行直接的mysql命令(因为我不知道root密码)

mysql plesk

4
推荐指数
3
解决办法
2万
查看次数

php容器类:为什么每个人都使用更复杂的方法?

当我找到php的脚本或查看php框架时,我看到一个"注册表类"或"容器类",它通常使用__get魔术方法保存变量或其他对象.

这是我的意思的简化示例:

例1:

class container {
 private $objects;
 public function __get($class){
  if(isset($this->objects[$class])){
   return $this->objects[$class];
  }
  return $this->objects[$class] = new $class();
 }
}
Run Code Online (Sandbox Code Playgroud)

上面的例子在创建类时会有更多的函数,而不是只调用它,但对于我的例子,它应该就足够了."示例1"是我在从互联网下载的脚本中大多看到的,它维护着一个单独的类实例,现在我想知道的是,这个例子不会做同样的事情并且效率更高:

例2:

class simplecontainer {
 public function __get($class){
  return $this->$class = new $class();
 }
}
Run Code Online (Sandbox Code Playgroud)

但我从未在其他人的剧本中看到"例2",这使我在考虑使用它之前会三思而后行.

我使用它们将包含的几个类来测试容器与简单容器,并且重复使用大约100000次,"示例1"在我的本地机器上以0.75秒进行测试,"示例2"在0.29秒内进行测试.

我应该在我的脚本中使用哪个?例1或例2?为什么?

php containers

4
推荐指数
1
解决办法
1万
查看次数

如何将带有HTML entites和无效字符的文本转换为UTF-8等效字符?

我正在更改标题,因为我不知道特殊的破窗口字符导致我的问题,使问题看起来像一个副本.

如何转换HTML实体,类型&#[0-9] +的字符引用; 和&#x [a-fA-F0-9] +;,无效的字符引用 - 和无效的windows字符chr(151)到它们的UTF-8等价物?

基本上如何清理一些非常糟糕的变量编码文本并将其保存为UTF-8?

原始问题如下

转换&#[0-9] +; 和&#x [a-fA-F0-9] +; 参考UTF-8等值?

例如

&#151;
&#x97;
Run Code Online (Sandbox Code Playgroud)

至 -

像浏览器一样,但用PHP.

编辑:甚至是Windows制作的非标准版,但浏览器仍然显示.

html php utf-8 character-encoding iconv

4
推荐指数
1
解决办法
4788
查看次数