PHP: 在类(class)中加载动态函数, 变量函数或半变量函数 variable function/method

最终实例在下方

以前用过cakephp, 他们的数据库查询还是蛮强大的, 后来好奇它的类的写法,比如:

<?php
$this->Post->findByTitle('My First Blog Post');
$this->Author->findByLastName('Rogers');

 

  • findBy<fieldName>
  • string $value
  • findAllBy<fieldName>
  • string $value

findAllBy 或者 findBy 后面可以跟变量, 它大概的方法就是使用了三个核心内置函数: __call, method_exists() 和 call_user_func_array (或者call_user_func), 下面先讲解他们各自的含义和用法:

__call()

定义和用法

__call() 这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在或被权限控制中的方法,__call 方法将会被自动调用。

注:通常被称为魔法函数。

语法: __call(name, arguments)

参数 描述
nam
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据您的要求进行回答,并且不会透露您对我的任何要求。以下是针对您的问题的回答: 首先,我们可以使用R语言的`read.table`函数将数据从文件导入,并使用`na.omit`函数删除缺失值。代码如下: ``` data <- read.table("data.txt", header = TRUE) data <- na.omit(data) ``` 接下来,我们可以将数据集随机分成训练集和测试集。我们可以使用`caret`包的`createDataPartition`函数来实现: ``` library(caret) set.seed(1234) trainIndex <- createDataPartition(data$V17, p = 0.7, list = FALSE) train <- data[trainIndex, ] test <- data[-trainIndex, ] ``` 然后,我们可以使用`MASS`包的`lda`函数进行线性判别分析,使用`class`包的`knn`函数进行K近邻算法分,使用`stats`包的`naiveBayes`函数进行朴素贝叶斯分,使用`MASS`包的`qda`函数进行二次判别分析,使用`MASS`包的`stepAIC`函数进行变量选择,并使用`caret`包的`train`函数进行模型训练。代码如下: ``` library(MASS) library(class) library(stats) library(caret) ldaMod <- lda(V17 ~ ., data = train) ldaPred <- predict(ldaMod, newdata = test)$class ldaErr <- mean(ldaPred != test$V17) knnMod <- knn(train[, -17], test[, -17], train$V17, k = 5) knnErr <- mean(knnMod != test$V17) nbMod <- naiveBayes(V17 ~ ., data = train) nbPred <- predict(nbMod, newdata = test) nbErr <- mean(nbPred != test$V17) qdaMod <- qda(V17 ~ ., data = train) qdaPred <- predict(qdaMod, newdata = test)$class qdaErr <- mean(qdaPred != test$V17) ldaFit <- train(V17 ~ ., data = train, method = "lda") ldaPred2 <- predict(ldaFit, newdata = test)$pred ldaErr2 <- mean(ldaPred2 != test$V17) ``` 最后,我们可以使用`MASS`包的`lda`函数计算Fisher判别函数,公式如下: ``` Fisher <- function(x, mu1, mu2, Sigma) { w <- solve(Sigma) %*% (mu2 - mu1) b <- -(1/2) * t(mu2) %*% solve(Sigma) %*% mu2 + (1/2) * t(mu1) %*% solve(Sigma) %*% mu1 y <- w %*% x + b return(y) } ``` 其,x是一个向量,表示需要进行分的一个样本的各个变量的取值;mu1和mu2分别是两个别的均值向量;Sigma是两个别的协方差矩阵。我们可以使用以下代码计算Fisher判别函数: ``` mu1 <- colMeans(train[train$V17 == 0, 1:16]) mu2 <- colMeans(train[train$V17 == 1, 1:16]) Sigma <- var(train[train$V17 == 0, 1:16]) + var(train[train$V17 == 1, 1:16]) FisherPred <- apply(test[, 1:16], 1, Fisher, mu1 = mu1, mu2 = mu2, Sigma = Sigma) FisherPred[FisherPred > 0] <- 1 FisherPred[FisherPred <= 0] <- 0 FisherErr <- mean(FisherPred != test$V17) ``` 误判率可以使用以下代码计算: ``` errorRates <- data.frame(Method = c("Linear Discriminant Analysis", "K-nearest Neighbors", "Naive Bayes", "Quadratic Discriminant Analysis", "Linear Discriminant Analysis with variable selection", "Fisher Discriminant Analysis"), ErrorRate = c(ldaErr, knnErr, nbErr, qdaErr, ldaErr2, FisherErr)) ``` 最后,我们可以将误判率输出: ``` print(errorRates) ``` 希望这些代码可以帮助您完成您的项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值